使用JavaScript解析逗号分隔的字符串?

时间:2018-12-09 23:10:55

标签: javascript regex csv

我需要使用JavaScript解析csv文件。 如果仅使用str.split(',')值本身不包含逗号,则解析逗号分隔的字符串可能很容易。但是,如果字符串为以下内容,该怎么办:

12.0,trs,“美国纽约州xx-xx”

有时在所有值上都用双引号或双引号引起来:

“ 12.0”,“ trs”,“ xx-xx NY,US”

但有时逗号后还会有其他空格:

“ 12.0”,“ trs”,“ xx-xx NY,US”

我想我需要使用正则表达式,但是找不到涵盖所有情况的通用表达式。请帮忙!

4 个答案:

答案 0 :(得分:1)

您可以将正则表达式添加到拆分中。

var date = "02-25-2010";
var myregexp2 = new RegExp("/(?:[^",]+|"[^"]*")+/g"); 
dateArray = date.split(myregexp2);

答案 1 :(得分:1)

由于其他答案主要使用正则表达式,因此这里有一个幼稚的实现,您可以如何通过遍历每行的字符来解析它。显然,它不会像其他答案那样有效,只是一种处理您输入内容的可能方式

const settings = {
  separator: ',',
  wrap: '"',
  ignore: ' '
};

const csv = [
  '12.0,trs,"xx-xx NY,US"',
  '"12.0","trs","xx-xx NY,US"',
  '"12.0","trs", "xx-xx NY,US"',
  '"12.0","trs", "xx-xx ""NY"",US"'
];

function parseLine( line ) {
  let 
    insideWrap = false, 
    isFirst = true;
  return line.split('').reduce( (columns, char) => {
    if (insideWrap) {
      if (char === settings.wrap) {
        insideWrap = false;
        return columns;
      }
    } else {
      if (char === settings.wrap) {
        insideWrap = true;
        if (isFirst) {
          isFirst = true;
          return columns;
        }
      }
      if (char === settings.separator) {
        isFirst = true;
        return columns;
      }
      if (isFirst && char === settings.ignore) {
        return columns;
      }
    }
    if (isFirst) {
      isFirst = false;
      columns.push('');
    }
    const idx = columns.length - 1;
    columns[idx] += char;
    return columns;
  }, []);
}

function getCsvData( lines ) {
  return lines.map( parseLine );
}

console.log( getCsvData( csv ) );

答案 2 :(得分:0)

使用match代替split,并重复匹配非逗号,非"字符或匹配",然后再匹配非{{1 }}个字符(因此根据需要在"内匹配逗号),后跟另一个"。还要在模式的开头对空格使用负前瞻,以确保第一个匹配的字符不是空格:

"

答案 3 :(得分:0)

使用正则表达式解析csv并不是一个好主意,除非您提前知道csv将符合您可以预测的非常具体的限制。实际上,这种情况很少见,这就是为什么人们会遇到制作csv解析器的麻烦。 See here进行了长时间的讨论。

那里有几个解析器,它们通常很容易使用。例如,使用Papa Parse,您可以仅在字符串上调用parse,而不必担心边缘情况:

console.log(Papa.parse('12.0,trs,"xx-xx NY,US"').data[0])
console.log(Papa.parse('"12.0","trs","xx-xx NY,US"').data[0])
<script src="https://cdnjs.cloudflare.com/ajax/libs/PapaParse/4.6.2/papaparse.js"></script>