当前位置: 代码迷 >> JavaScript >> 如何将包含任意文本的CSV数据的字符串拆分为JavaScript数组数组?
  详细解决方案

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

热度:61   发布时间:2023-06-05 14:06:03.0

我有一个包含文件中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(',');    
}

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

512,"""Fake News"" and the ""Best Way"" to deal with A, B, and C", 1/18/2019,media

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

 "Fake News" and the "Best Way" to deal with A, B, and C

谢谢。

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

这应该这样做:

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

它将返回数组中的值:

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']

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

let parsedCsv = theCsv.split(/\r?\n/).map(parseRow);

说明

代码可能看起来有点模糊。 但主要思想如下:我们按字符解析字符串。 当我们遇到"我们设置isInQuotes = true 。这将改变解析的行为,和"" 。当我们遇到一个"我们再次设置isInQuotes = false时。

  相关解决方案