powershell 将[UNIX(LF)UTF-8]转换为[Windows(CRLF)ANSI]

sz81bmfz  于 2022-11-10  发布在  Shell
关注(0)|答案(1)|浏览(226)

我有一个VB程序,它使用位于文本文件中的数据库。当在记事本中打开这个文件时,它告诉我格式是“WINDOWS(CRLF)|ANSI”。

  • 我将数据库转移到Google Sheets中,可以很容易地由多个用户更新。
  • 我开发了一个谷歌应用程序脚本,将谷歌表格中的数据提取到驱动器上的文本文件中。
    问题是当我从Google Sheets电子表格中检索文件时,它是“UNIX(LF)|UTF-8”格式,并且当我将该文件指定为VB程序的源文件时,它不能正确显示某些字符(*“é”;“ô”等)。

我尝试了bash命令:Set-Content C:\Output\file.txt -Encoding Ascii,但当我用Windows记事本打开它时,我仍然看到“UTF-8”。
我正在寻找一种方法,以UTF-8编码的文本文件从谷歌驱动器恢复到ANSI(Windows-1252)编码的文件。我接受解决方案,无论它是在Bash脚本中还是在Google Apps脚本中(即使我认为对于GSCRIPT来说这是不可能的)

  • 用于从工作表提取数据的Google Apps脚本代码:*
  • 将数据表转换为字符串的函数。
/**
 * Conversion de la feuille Google Sheets en une chaîne de caractères.
 * Cette chaîne de car. peut servir à la création d'un fichier texte.
 * Le séparateur de ligne est un retour à la ligne (" \n ")
 * Le séparateur de colonne est une tabulation (" \t ")
 * 
 * @param {SpreadsheetApp.Sheet} sheet 
 * 
 * @return {String} txt
 */
function _getData( sheet ){
  var numRows = sheet.getDataRange().getNumRows();
  var data;
  var txt = "";

  try {
      data = sheet.getDataRange().offset( 1, 0, numRows - 1).getDisplayValues(); // récupération des valeurs de la feuille (hormis l'en-tête).
      txt = data.map(function (col) {return col.join('\t');}).join('\n'); // Création d'une chaîne de caractère unique. (Delimiter col : tab ; Delimiter row : backslash)

  }catch( err) {
    Logger.log(err);
    Browser.msgBox('Erreur : ' + err);
  }
  finally{
    return txt;
  }
}
  • 从BLOB创建文本文件
/**
 * 
 * Création d'un fichier au format DAT.
 * Le fichier sera situé dans le répertoire : 
 * 
 * 
 * @param {String} extractName
 * @param {String} data
 * 
 * @return {DriveApp.File} file

* /

function createDatFile( extractName, data ){
  var blob;
  var directory;
  var fileName = extractName + ".DAT";
  var file;

  try{
    directory = DriveApp.getFolderById(''); // Répertoire Drive Partagé où l'extraction sera effectuée.
    blob = Utilities.newBlob( '' , MimeType.PLAIN_TEXT).setDataFromString( data ); // Création d'un Blob de données à partir d'une chaîne de caractères.

    // TODO Supprimer le fichier s'il existe déjà.

    file = DriveApp.createFile( fileName, blob.getDataAsString() ).moveTo( directory ); // Création d'un fichier au format ".DAT" dans un répertoire.

    return file;

  }catch(err){
    Logger.log("Erreur : " + err);
    Browser.msgBox("Erreur : " + err)
  }
}
  • Main
function exportToTextFile() {
  var activeSheet;
  var extractName = "SRC_DATA";
  var data;

  activeSheet = SpreadsheetApp.getActive().getActiveSheet();

  data = _getData( activeSheet ); 

  createDatFile( extractName, data);

  return 
}
ni65a41a

ni65a41a1#

我相信你的目标如下。

  • 您想创建一个字符代码为windows-1252的文本文件。

当您的脚本被修改时,下面的修改如何?

发自:

blob = Utilities.newBlob( '' , MimeType.PLAIN_TEXT).setDataFromString( data );

// TODO Supprimer le fichier s'il existe déjà.

file = DriveApp.createFile( fileName, blob.getDataAsString() ).moveTo( directory );

至:

blob = Utilities.newBlob("", MimeType.PLAIN_TEXT, fileName).setDataFromString(data, "windows-1252"); // or "CP1252"
file = DriveApp.createFile(blob).moveTo(directory);

参考文献:

  • setDataFromString(字符串,字符集)
  • createFile(BLOB)

相关问题