首页 文章

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

提问于
浏览
-1

我需要使用JavaScript解析csv文件 . 如果值仅使用str.split(',')不包含逗号,则解析逗号分隔的字符串可能很容易 . 但是如果字符串如下,它是如何完成的:

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

或者有时所有值都有引号或双引号:

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

但有时逗号后面还有额外的空格:

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

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

4 回答

  • 1

    使用 match 而不是 split ,并重复匹配非逗号,非 " 字符或匹配 " ,然后是非 " 字符(因此根据需要匹配 " 中的逗号),然后是另一个 " . 对模式开头的空格使用负前瞻,以确保第一个匹配的字符不是空格:

    const translate = str => console.log(
      str.match(/(?! )(?:[^",]+|"[^"]*")+/g)
    );
    
    [
      `12.0,trs,"xx-xx NY,US"`,
      `"12.0","trs","xx-xx NY,US"`,
      `"12.0","trs", "xx-xx NY,US"`
    ].forEach(translate);
    
  • 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>
    
  • 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 ) );
    
  • 0

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

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

相关问题