我有一个基于某些数据形成的字符串。它包含一个用逗号分隔的值的列表。
我通过一个函数运行此字符串,该函数使我可以分隔这些值,以便可以在HTML中正确显示它们。
这很好。但是,有一个错误我无法解决。返回的值之一来自HTML文本字段,这意味着用户可以在多个不同的行上书写。结果,我用来拆分值的函数就是将文本字段值拆分为多行。
我已经安慰了我的字符串在命中该功能之前进行了记录。如您所见,注释在引号中看起来不错,中间有空格。
20,Order,Item,Title,,Assignee,Comments,Image Path,Timestamp,Due Date,Completed
21,0,1,"Issue 1",,"","I have some comments that are
going here on multiple lines",,"2019/11/28, 12:20:55","",""
函数
csvToJSON(csv) {
const lines: string[] = csv
// escape everything inside quotes to NOT remove the comma there
.replace(/"(.*?)"/gm, (item) => encodeURIComponent(item))
.split('\n');
lines.pop();
// separate the headers from the other lines and split them
const headers: string[] = lines.shift().split(',');
// should contain all CSV lines parsed for the html table
const data: any[] = lines.map((lineString, index) => {
const lineObj = {};
const lineValues = lineString.split(',');
headers.forEach((valueName, index) => {
// remove trailing spaces and quotes
if (lineValues[index] != undefined) {
lineObj[valueName] = lineValues[index].replace(/%22(.*?)%22/gm, (item) => decodeURIComponent(item)).trim();
}
});
return lineObj; // return lineObj for objects.
});
console.log('csvToJSON - data = ', data);
return { data, headers };
}
在上述功能中,您可以在最后看到一个控制台日志,以记录最终转换后的数据。
这最终导致以下结果:
0: {20: "21", Order: "0", Item: "1", Title: ""Issue 1"", "": "", Assignee: """", …}
1: {20: ""}
2: {20: "going here on multiple lines",,"2019/11/28", Order: "12:20:55","","""}
如您所见,我的评论有些刺耳。
有没有一种方法可以解决此问题,以便将其他所有内容正确地分开,但我的注释文本(可以有多行)没有被分解?
答案 0 :(得分:0)
尝试此方法
function CSVtoArray(text) {
var re_valid = /^\s*(?:'[^'\\]*(?:\\[\S\s][^'\\]*)*'|"[^"\\]*(?:\\[\S\s][^"\\]*)*"|[^,'"\s\\]*(?:\s+[^,'"\s\\]+)*)\s*(?:,\s*(?:'[^'\\]*(?:\\[\S\s][^'\\]*)*'|"[^"\\]*(?:\\[\S\s][^"\\]*)*"|[^,'"\s\\]*(?:\s+[^,'"\s\\]+)*)\s*)*$/;
var re_value = /(?!\s*$)\s*(?:'([^'\\]*(?:\\[\S\s][^'\\]*)*)'|"([^"\\]*(?:\\[\S\s][^"\\]*)*)"|([^,'"\s\\]*(?:\s+[^,'"\s\\]+)*))\s*(?:,|$)/g;
if (!re_valid.test(text)) return null;
var a = [];
text.replace(re_value,
function(m0, m1, m2, m3) {
if (m1 !== undefined) a.push(m1.split("|");
else if (m2 !== undefined) a.push(m2.split(","));
else if (m3 !== undefined) a.push(m3);
return '';
});
if (/,\s*$/.test(text)) a.push('');
return a;
};