我需要使用JavaScript解析csv文件 . 如果值仅使用str.split(',')不包含逗号,则解析逗号分隔的字符串可能很容易 . 但是如果字符串如下,它是如何完成的:
12.0,trs,“xx-xx NY,US”
或者有时所有值都有引号或双引号:
“12.0”,“trs”,“xx-xx NY,US”
但有时逗号后面还有额外的空格:
我想我需要使用正则表达式,但我找不到通用表达式,涵盖所有情况 . 请帮忙!
使用 match 而不是 split ,并重复匹配非逗号,非 " 字符或匹配 " ,然后是非 " 字符(因此根据需要匹配 " 中的逗号),然后是另一个 " . 对模式开头的空格使用负前瞻,以确保第一个匹配的字符不是空格:
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);
使用正则表达式解析csv并不是一个好主意,除非您提前知道csv将符合您可以预测的非常具体的限制 . 在实践中,这种情况很少发生,这就是为什么人们会遇到制作csv解析器的麻烦 . See here进行了长时间的讨论 .
有几个解析器,一般都很容易使用 . 例如,使用Papa Parse,您可以在字符串上调用 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>
由于其他答案主要使用正则表达式,这里有一个简单的实现,你可以通过循环遍历每一行的字符来解析它 . 它显然不如其他答案那么有效,只是一种可能的方式来处理你的输入
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 ) );
您可以将正则表达式添加到拆分中 .
var date = "02-25-2010"; var myregexp2 = new RegExp("/(?:[^",]+|"[^"]*")+/g"); dateArray = date.split(myregexp2);
4 回答
使用
match
而不是split
,并重复匹配非逗号,非"
字符或匹配"
,然后是非"
字符(因此根据需要匹配"
中的逗号),然后是另一个"
. 对模式开头的空格使用负前瞻,以确保第一个匹配的字符不是空格:使用正则表达式解析csv并不是一个好主意,除非您提前知道csv将符合您可以预测的非常具体的限制 . 在实践中,这种情况很少发生,这就是为什么人们会遇到制作csv解析器的麻烦 . See here进行了长时间的讨论 .
有几个解析器,一般都很容易使用 . 例如,使用Papa Parse,您可以在字符串上调用
parse
并停止担心边缘情况:由于其他答案主要使用正则表达式,这里有一个简单的实现,你可以通过循环遍历每一行的字符来解析它 . 它显然不如其他答案那么有效,只是一种可能的方式来处理你的输入
您可以将正则表达式添加到拆分中 .