Utilities.parseCsv()'无法解析文本' (Google Apps脚本)

时间:2017-03-28 11:04:42

标签: google-apps-script

我真的很困惑,因为这工作得很早,而且我不知道为什么它现在坏了。我已经获得了我试图解析的CSV文件。我使用以下代码访问它们:

var file = DriveApp.getFileById(fileID);
var csv = file.getBlob().getDataAsString();
var data = Utilities.parseCsv(csv);

它在第3行崩溃了。调试时,我看到一切看起来都正常...... file是一个对象,csv是一个字符串,基于预览,我认为格式看起来正确的CSV('header1,header2,header3 data1,data2,data3 data4,data5,data6...'等) 。然而,data未定义。可能导致此错误的原因是什么?我没有在网上找到太多内容,调试并没有为我提供任何好的见解。

CSV中是否有可能破坏此功能的特定符号? CSV数据中有'"符号......但我不知道为什么这应该重要。

更新 我的文件有大约16000行。我目前正在分段试图缩小问题范围。但它不是引用;我使用解析器进行了如下测试,它按预期工作:

function myFunction() {
  var a = 'test""123,456\n';
  var b = "abc' 'def,ghi\n";
  var h = 'x,y\n';
  var str = h+a+b;
  var csv = Utilities.parseCsv(str);
  Logger.log(str);
  Logger.log(csv);
}

日志文件看起来像这样(预期):

x,y
test""123,456
abc' 'def,ghi

[[x, y], [test""123, 456], [abc' 'def, ghi]]

如果您有任何想法可以测试可能导致这种情况的原因,我可以测试它们。

3 个答案:

答案 0 :(得分:0)

我尝试测试你的功能略有修改,它看起来好像。这是我用过的那个。如果您可以与我们分享数据文件,我很高兴看看这个问题。

function prrrrse() 
{
  var br = '<br />';
  var a = 'test""123,456\n';
  var b = "abc' 'def,ghi\n";
  var h = 'x,y\n';
  var str = h+a+b;
  var delimiter = ',';
  var csv = Utilities.parseCsv(str,delimiter);
  var s = 'str=' + str + br + 'delimiter=' + delimiter + br;
  for(var i = 0;i<csv.length;i++)
  {
    s+='csv[' + i + ']=';
    for(var j=0;j<csv[i].length;j++)
    {
      if(j>0)s+=' , ';
      s+=csv[i][j];
    }
    s+= br;
  }
  dispStatus('Parsing',s, 800, 600); 
}


function dispStatus(title,html,width,height,modal)
{
  var title = typeof(title) !== 'undefined' ? title : 'No Title Provided';
  var width = typeof(width) !== 'undefined' ? width : 400;
  var height = typeof(height) !== 'undefined' ? height : 300;
  var html = typeof(html) !== 'undefined' ? html : '<p>No html provided.</p>';
  var modal = typeof(modal) !== 'undefined' ? modal : false;
  var htmlOutput = HtmlService
     .createHtmlOutput(html)
     .setWidth(width)
     .setHeight(height);
 if(!modal)
 {
   SpreadsheetApp.getUi().showModelessDialog(htmlOutput, title);
 }
 else
 {
   SpreadsheetApp.getUi().showModalDialog(htmlOutput, title);
 }
} 

答案 1 :(得分:0)

对于它的价值,我只是遇到了一个类似的问题,在尝试找到一个错误的逗号之后,最终得到了一个更简单的解决方案。 csv中的行18,000左右(在20,000以上)中有一个额外的换行符(\n)。消除换行符可以解决问题。

答案 2 :(得分:0)

我今天正在处理同样的问题,发现某些行末尾的空格导致解析器失败。我使用以下正则表达式解决了这个问题:csvString.replace(/[ \t]+$/gm, '')