我需要使用JavaScript解析csv文件。 如果仅使用str.split(',')值本身不包含逗号,则解析逗号分隔的字符串可能很容易。但是,如果字符串为以下内容,该怎么办:
12.0,trs,“美国纽约州xx-xx”
有时在所有值上都用双引号或双引号引起来:
“ 12.0”,“ trs”,“ xx-xx NY,US”
但有时逗号后还会有其他空格:
“ 12.0”,“ trs”,“ xx-xx NY,US”
我想我需要使用正则表达式,但是找不到涵盖所有情况的通用表达式。请帮忙!
答案 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>