我可以使用应用脚本在Google云端硬盘中解压缩文件吗?

时间:2017-07-02 11:37:01

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

这是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文件的任何想法吗?

感谢。

3 个答案:

答案 0 :(得分:1)

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

尝试更改

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);

  }

}

尝试在原始文件的一部分上运行此脚本&#34; GlicemiaMisurazioni.csv.gz&#34;档案: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

答案 1 :(得分:1)

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

答案 2 :(得分:0)

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