如何将包含任意文本的CSV数据的字符串拆分为JavaScript数组数组?

Dou*_*ner 6 javascript csv arrays

我有一个包含文件中CSV数据的长字符串.我想将它存储在JavaScript Array of Arrays中.但是一列中有任意文本.该文本可能包含双引号和逗号.

将CSV字符串拆分为单独的行字符串是没有问题的:

var theRows = theCsv.split(/\r?\n/);

但那我怎么能最好地划分每一行呢?

由于它是CSV数据,我需要用逗号分割.但

var theArray = new Array();
for (var i=0, i<theRows.length; i++) {
    theArray[i] = theRows[i].split(',');    
}
Run Code Online (Sandbox Code Playgroud)

不适用于包含引号和逗号的元素,如下例所示:

512,"""Fake News"" and the ""Best Way"" to deal with A, B, and C", 1/18/2019,media
Run Code Online (Sandbox Code Playgroud)

如何确保第二个元素正确存储在单个数组元素中

 "Fake News" and the "Best Way" to deal with A, B, and C
Run Code Online (Sandbox Code Playgroud)

谢谢.

不幸的是,当我在那里尝试CSVtoArray函数时,看起来类似的建议解决方案不起作用.而不是返回数组元素,返回null值,如下面的评论中所述.

Max*_*meW 3

这应该可以做到:

let parseRow = function(row) {
  let isInQuotes = false;
  let values = [];
  let val = '';

  for (let i = 0; i < row.length; i++) {
    switch (row[i]) {
      case ',':
        if (isInQuotes) {
          val += row[i];
        } else {
          values.push(val);
          val = '';
        }
        break;

      case '"':
        if (isInQuotes && i + 1 < row.length && row[i+1] === '"') {
          val += '"'; 
          i++;
        } else {
          isInQuotes = !isInQuotes
        }
        break;

      default:
        val += row[i];
        break;
    }
  }

  values.push(val);

  return values;
}
Run Code Online (Sandbox Code Playgroud)

它将返回数组中的值:

parseRow('512,"""Fake News"" and the ""Best Way"" to deal with A, B, and C", 1/18/2019,media');
// => ['512', '"Fake News" and the "Best Way" to deal with A, B, and C', ' 1/18/2019', 'media']
Run Code Online (Sandbox Code Playgroud)

要获取请求的数组数组,您可以执行以下操作:

let parsedCsv = theCsv.split(/\r?\n/).map(parseRow);
Run Code Online (Sandbox Code Playgroud)

解释

该代码可能看起来有点晦涩。但主要思想如下:我们逐个字符地解析字符串。当我们遇到一个"我们就设定了isInQuotes = true,这将改变解析和的行为""。当我们遇到一个人时,"我们会再次设置isInQuotes = false