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éé.

tsv file

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

2strtofile.zip (298.91 Ko)
2strconv.zip (333.32 Ko)

merci, je vais regarder cela !

Rechercher des sujets similaires à "google sheet export csv caracteres accentues"