Utilities.parseCsv()“无法解析文本”(谷歌Apps脚本)(Utilities.p

2019-09-28 15:23发布

我真的很困惑,因为这是较早的工作,我不知道为什么它现在打破。 我已经得到了我想要解析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]]

如果您有任何更多的想法进行测试,以什么可能导致这一点,我可以对其进行测试。

Answer 1:

我试图测试你的功能略有修改,它看起来像它的作品没关系。 下面是我用了一个。 如果你能与我们分享数据文件,我会很高兴来看看这个问题。

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


Answer 2:

对于它的价值,我只是有类似的问题突然出现,并试图找到一个错误的逗号后,结束了一个简单的解决方案。 在CSV行18000的东西(出20,000+的)不知何故有一个额外的换行符( \n它)。 省去了换行解决了这个问题。



Answer 3:

我今天用相同的处理问题,并发现了一些行末尾的尾随空格都导致解析器失败。 我解决了这个与此正则表达式: csvString.replace(/[ \t]+$/gm, '')



文章来源: Utilities.parseCsv() 'Could not parse text' (Google Apps Script)