【问题标题】:Can I ungzip files in Google Drive with apps script?我可以使用应用程序脚本在 Google Drive 中解压缩文件吗?
【发布时间】:2018-02-16 01:04:03
【问题描述】:

这是this thread的后续行动。

我正在尝试使用@July.Tech 那里提供的代码,但我不断收到未知压缩方法 错误或不正确的标头检查 错误。当使用两种不同的 gzip 方法中的任何一种来创建压缩文件时,就会出现错误,因此我认为该文件已正确 gzip 压缩。

有什么建议吗? (我的输入文件是 gzip 压缩的,所以我不能使用 Utilities.unzip()。)

这是完整的代码:

reports_folder_id = 'xxxxx'; //id of folder where gzipped csv reports are saved
report_name = 'xxxxxx.gz'; // name of gzipped CSV file

function importData() { 
  var fSource = DriveApp.getFolderById(reports_folder_id);
  var fi = fSource.getFilesByName(report_name); // latest report file

  eval(UrlFetchApp.fetch('https://cdn.rawgit.com/nodeca/pako/master/dist/pako.js').getContentText());

  if ( fi.hasNext() ) { // proceed if report_name file exists in the reports folder
    var file = fi.next();

    var charData = file.getBlob().getDataAsString(); // same error if .getBytes() is used

    var binData = [];
    for (var i = 0; i < charData.length; i++) {
      binData.push(charData[i] < 0 ? charData[i] + 256 : charData[i]);
    }

    var data = pako.ungzip(binData); // I get same error for pako.inflate(binData);

    var decoded = '';
    for (var i = 0; i < data.length; i++) {
      decoded += String.fromCharCode(data[i]);
    }

  }
}

如果没有解决上述问题的建议,关于如何以编程方式解压缩 gDrive 文件的任何想法?

谢谢。

【问题讨论】:

    标签: google-apps-script google-drive-api gzip


    【解决方案1】:

    截至 2018 年 1 月 19 日 (see release notes) Apps 脚本现在支持使用以下 Utilities 方法访问的 gzip 压缩:

    【讨论】:

    • 好消息。感谢分享。
    【解决方案2】:

    运行提供的示例代码确实会在我的环境中导致未知压缩方法错误。

    尝试改变

    var charData = file.getBlob().getDataAsString(); // same error if .getBytes() is used
    

    var charData = file.getBlob().getBytes();
    

    原来如此

    function myFunction() {
      reports_folder_id = '<FOLDER_ID>';
      report_name = 'zip3.csv.gz'; // name of gzipped CSV file
    
      var fSource = DriveApp.getFolderById(reports_folder_id);
      var fi = fSource.getFilesByName(report_name);
      eval(UrlFetchApp.fetch('https://cdn.rawgit.com/nodeca/pako/master/dist/pako.js').getContentText());
    
      if ( fi.hasNext() ) { 
        var file = fi.next();
        var blobData = file.getBlob();
    
        var charData = blobData.getBytes();
    
        var binData = [];
        for (var i = 0; i < charData.length; i++) {
          binData.push(charData[i] < 0 ? charData[i] + 256 : charData[i]);
        }
    
        var data = pako.inflate(binData); 
    
        var decoded = '';
        for (var i = 0; i < data.length; i++) {
          decoded += String.fromCharCode(data[i]);
        }
        Logger.log(decoded);
    
      }
    
    }
    

    尝试在原始“GlicemiaMisurazioni.csv.gz”文件的子集上运行此脚本:https://drive.google.com/file/d/0B8geUNXmd4J2YzJoemFLMnBTbVU/view?usp=sharing

    (为了测试,我将原始 csv 截断为 32 行以加快执行速度——原始的运行时间太长)

    查看日志显示解压成功:

    4;02/07/2017 03.00.30;;;158.0;158.0;1;0M0000UMQ5D;;;0;;
    4;02/07/2017 02.59.30;;;158.0;158.0;1;0M0000UMQ5D;;;0;;
    4;02/07/2017 02.58.30;;;159.0;159.0;1;0M0000UMQ5D;;;0;;
    4;02/07/2017 02.57.30;;;159.0;159.0;1;0M0000UMQ5D;;;0;;
    4;02/07/2017 02.56.30;;;158.0;158.0;1;0M0000UMQ5D;;;0;;
    4;02/07/2017 02.56.00;;;;;0;;0.4;Novorapid ;0;Left flank;Test
    

    【讨论】:

    【解决方案3】:

    您需要了解 pako 是否支持 gzip 压缩。如果没有,你应该寻找另一个支持 gzip 的压缩包。

    【讨论】:

    • pako 应该支持 gzip (nodeca.github.io/pako/#gzip) 但是代码不起作用。对修复我的代码或使用不同的包有什么具体建议吗?谢谢。
    猜你喜欢
    • 2017-02-13
    • 1970-01-01
    • 2017-04-25
    • 2020-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多