Google Sheet - Export CSV - caractères accentués
Bonjour à tous,
Je dois arriver à exporter une plage dynamique d'une feuille G.sheet au format csv délimité par tabulation afin de pouvoir importer les données ainsi obtenues dans une application Vfp9 (Visual Foxpro).
Pour cela pas de problème en passant par la copie de l'adresse de la feuille et en ajoutant les paramètres de type export (tsv), le gid de la feuille à traiter et le range des cellules à copier. Tout est donc pour le mieux. Ben non hélas.
Le problème vient des caractères accentués du français comme les accents circonflexes par exemple qui sont remplacé par la chaîne "+¬" ou "êt" selon que le codepage est 437 (US MS DOS x01), 850 (International MS-DOS x02), 1250 (Eastern European Windows xC8) ou 1252 (Windows ANSI x03) et il m'est impossible de récupérer les données avec ces caractères accentués même quand la table de destination a le même codepage que celui de l'exportation en csv.
Quelqu'un a-t-il une idée pour me permettre de me sortir de ce problème technique qui dépasse mon niveau débutant en g.sheet.
Merci d'avance
Guy
Bruxelles
Bonjour,
as-tu un exemple de données ?
voici un exemple d'exportation d'un fichier au format tsv ou dsv à choisir dans le menu en haut à droite * Export ... *
https://docs.google.com/spreadsheets/d/1h1xXLEOScw2duqydJwtBvZcsfO2vHI05WOf3fojC6VI/copy
code :
const where = 'test' // here the name of folder where you want to record the file
function onOpen() {
var ui = SpreadsheetApp.getUi();
ui.createMenu('* Export ... *')
.addItem('... to .dsv format !', 'createDSVFile')
.addItem('... to .tsv format !', 'createTSVFile')
.addToUi();
}
function createDSVFile() {
var sh = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
var lr=sh.getLastRow();
var lc=sh.getLastColumn();
var sep = '|';
var txt = '';
for (var i=1;i<=lr;i++){
for (var j=1;j<=lc;j++){
txt += sh.getRange(i,j).getValue() + sep
}
txt = txt.substring(0,txt.length-1) + '\n'
}
var folders = DriveApp.getFoldersByName(where);
if (folders.hasNext()) {
var folder = folders.next();
saveData(folder, 'myDSVFile.dsv',txt);
}
}
function createTSVFile() {
var sh = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
var lr=sh.getLastRow();
var lc=sh.getLastColumn();
var sep = '\t';
var txt = '';
for (var i=1;i<=lr;i++){
for (var j=1;j<=lc;j++){
txt += sh.getRange(i,j).getValue() + sep
}
txt = txt.substring(0,txt.length-1) + '\n'
}
var folders = DriveApp.getFoldersByName(where);
if (folders.hasNext()) {
var folder = folders.next();
saveData(folder, 'myTSVFile.tsv',txt);
}
}
function saveData(folder, fileName, content) {
var children = folder.getFilesByName(fileName);
var file = null;
if (children.hasNext()) {
file = children.next();
file.setContent(content);
} else {
file = folder.createFile(fileName, content);
}
toast('File "' + fileName + '" recorded !')
}
function toast(body, title, timeout) {
return SpreadsheetApp.getActive().toast(
body,
title || "information",
timeout || 5 // In seconds
);
}
Bonjour Mike,
Merci pour ta réponse nocturno-matinale.
J'ai créé une copie du fichier, donné les autorisations ad-hoc et testé. Le premier problème que je rencontre est que si le script s'exécute correctement (selon Google Sheet), je ne parviens pas à trouver où il sauve le fichier TSV (je n'ai aucun outil sur mon pc pour lire un DSV). J'ai aussi remplacé la constante Where ('test') par un chemin complet sur un répertoire existant sur le pc, rien n'y fait, le fichier "myTSVfile.tsv" est introuvable. J'ai regardé aussi dans Google drive mais il est aussi absent.
Si tu souhaites voir le cas complet pratique, je peux te donner accès au fichier de travail mais uniquement par MP vu qu'il s'agit de données réelles.
Guy
Bruxelles
Désolé, j'aurais dû dire ne effet que where doit désigner un dossier du drive (en tous cas du pac), après tu peux télécharger à partir du drive sur ton pc, mais le script ne peut pas le faire (sécurité oblige de tous les pages html).
Ensuite tu peux normalement ouvrir le fichier créé.
Merci Mike,
c'était en effet un problème de config que j'ai corrigé puis processus d'acceptation et de transfert sur pc du fichier en "test" sur le drive Google.
je constate qu'en fait le problème ne se trouve pas dans l'exportation mais bien dans l'importation des données dans la table Visual Foxpro. En effet, bien que le .tsv soit encodé en utf-8, Vfp9 refuse d'affecter la bonne configuration des données quelque soit le codepage utilisé (437, 850, 1250 ou 1252). Il apparaîtrait qu'il y a un conflit majeur d'interprétation des caractères entre Vfp et Windows en ce qu'il ne parvient pas à réaffecter les bons critères d'encodage du fichier.
selon le code utilisé, j'obtiens par exemple "Ã" pour le "é" majuscule et pour le le "à" majuscule.
je vais voir si des solutions autres que la recherche/remplacement existent pour Vfp.
Encore un tout grand merci et je marque le dossier comme résolu puisque le problème n'est pas au niveau de Gsheet.
Guy
Bruxelles
Va faire un tour ici du reste https://www.google.com/search?q=Vfp9+foxpro+unicode&oq=Vfp9+foxpro+unicode
Je comprends qu'à l'origine foxpro ne tenait compte que des caractères AINSI, et 1250, 1251, 1252 etc. étaient aussi fait à l'orogine pour donner au même caractères plusieurs significations selon la langue. C'était avant la codif utf-8 qui du reste permettant alors d'écrire dans un même texte plusieurs mots de langues différente (grec/cyrillic/latin). La lecture des quelques pages ne m'a pas vraiment apporté de solutions.
Re Mike,
Je te suis complètement quant à la lecture des pages et finalement, via une procédure à l'importation, j'arrive à contourner le problème. A titre d'info, je te fournis ci-dessous la procédure commentée qui semble parfaitement fonctionner pour les caractères accentués français :
PROCEDURE Utf_TO_win
* gestion de la table destinatrice qui doit être vide
IF NOT USED("Journal1")
SELECT 0
USE journal1
ENDIF
SELECT journal1
* évite toutes les demandes du système
SET SAFETY OFF
ZAP
*conversion du fichier UTF-8 en Double (par le 2ème paramètre : 11)
lcMyFile =STRCONV(FILETOSTR("Fabrique 23 - 2020 - Export Vfp9 (10).tsv"),11)
*crée le fichier d'importation
STRTOFILE(lcMyFile,"myNewFile.txt")
*restaure la sécurité des données
SET SAFETY ON
*importation et visualisation des données importées
SELECT journal1
APPEND FROM myNewFile.txt DELIMITED WITH tab
BROWSE last NOWAIT
ENDPROC
J'ai encore 2 ou 3 tests à effectuer sur les datas réelles mais j'ai très bon espoir vu les premiers essais effectuer.
Guy
Re Mike (2)
Pour être complet, je joins la documentation pour les 2 fonctions du moteur de transfert des caractères accentués en vfp.
Guy
merci, je vais regarder cela !