分割字符串以CSV格式

时间:2019-12-02 09:46:09

标签: javascript csv split

我有一个基于某些数据形成的字符串。它包含一个用逗号分隔的值的列表。

我通过一个函数运行此字符串,该函数使我可以分隔这些值,以便可以在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","","""}

如您所见,我的评论有些刺耳。

有没有一种方法可以解决此问题,以便将其他所有内容正确地分开,但我的注释文本(可以有多行)没有被分解?

1 个答案:

答案 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;
    };