我希望能够将CSV转换为JSON。csv是这样的自由文本(带有换行符):
name,age,booktitle
John,2,Hello World
Mary,3,""Alas, What Can I do?""
Joseph,5,"Waiting, waiting, waiting"
可以告诉我的问题是文件...
我希望输出在每个字段中都没有任何引号和结尾引号...如何正确创建一个从从CSV字符串中解析出来的JSON对象,该字符串准确地表示了CSV?(不包括前导和尾随引号)。
我通常使用:
var mycsvstring;
var finalconvertedjson = {};
var headerfields = // get headers here
var lines = mycsvstring.split('\n');
for(var i = 0; i < lines.length; i++) {
// loop through each line and set a key for each header field that corresponds to the appropriate lines[i]
}
我的第一个猜测是使用正则表达式。您可以尝试我刚刚讲过的这一项(regex101链接):
/(?:[\t ]?)+("+)?(.*?)\1(?:[\t ]?)+(?:,|$)/gm
这可用于提取字段。因此,您也可以使用它来获取标题。第一个捕获组用作带有反向引用的可选quote-grabber,因此实际数据在中matchAll(regex)[2]
。在所有情况下,都使用过滤器来截断最后一个匹配项,因为允许空白字段(f1,,f3
)在末尾添加零宽度匹配项。使用JavaScript而不是使用正则表达式更容易摆脱这种情况。
const csvToJson = (str, headerList, quotechar = '"', delimiter = ',') => {
const cutlast = (_, i, a) => i < a.length - 1;
// const regex = /(?:[\t ]?)+("+)?(.*?)\1(?:[\t ]?)+(?:,|$)/gm; // no variable chars
const regex = new RegExp(`(?:[\\t ]?)+(${quotechar}+)?(.*?)\\1(?:[\\t ]?)+(?:${delimiter}|$)`, 'gm');
const lines = str.split('\n');
const headers = headerList || lines.splice(0, 1)[0].match(regex).filter(cutlast);
const list = [];
for (const line of lines) {
const val = {};
for (const [i, m] of [...line.matchAll(regex)].filter(cutlast).entries()) {
// Attempt to convert to Number if possible, also use null if blank
val[headers[i]] = (m[2].length > 0) ? Number(m[2]) || m[2] : null;
}
list.push(val);
}
return list;
}
const testString = `name,age,booktitle
John,,Hello World
Mary,3,""Alas, What Can I do?""
Joseph,5,"Waiting, waiting, waiting"
"Donaldson Jones" , six, "Hello, friend!"`;
console.log(csvToJson(testString));
console.log(csvToJson(testString, ['foo', 'bar', 'baz']));
作为奖励,我编写此代码是为了允许传递字符串列表以用作标题,因为我直接知道并非所有CSV文件都具有这些字符串。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句