【问题标题】:Turn an array of strings to csv format将字符串数组转换为 csv 格式
【发布时间】:2019-06-14 00:19:39
【问题描述】:

我有一个字符串数组:

let transactions = [
    "   Date     ||  Credit   ||  Debit   ||  Balance  ",
    "20/01/2019  ||          ||  9.00  ||  162.00",
    "20/01/2019  ||  90.00  ||          ||  171.00",
    "20/01/2019  ||          ||  9.00  ||  81.00",
    "20/01/2019  ||  90.00  ||          ||  90.00"
];

我用transactions.replace(/\s/g, '')把它变成了这个

"Date||Credit||Debit||Balance20/01/2019||||9.00||162.0020/01/2019||90.00||||171.0020/01/2019||||9.00||81.0020/01/2019||90.00||||90.00"

我正在尝试从中删除所有| 并用逗号替换它们。

这实际上不起作用transactions.replace(/|{2,}/g,",")

错误 无效的正则表达式:/|{2}/: 没有可重复的内容

然后transactions.replace(/|{+}/g,",") 返回:

",D,a,t,e,|,|,C,r,e,d,i,t,|,|,D,e,b,i,t,|,|,B,a,l,a,n,c,e,2,0,/,0,1,/,2,0,1,9,|,|,|,|,9,.,0,0,|,|,1,6,2,.,0,0,2,0,/,0,1,/,2,0,1,9,|,|,9,0,.,0,0,|,|,|,|,1,7,1,.,0,0,2,0,/,0,1,/,2,0,1,9,|,|,|,|,9,.,0,0,|,|,8,1,.,0,0,2,0,/,0,1,/,2,0,1,9,|,|,9,0,.,0,0,|,|,|,|,9,0,.,0,0,"

我想要的只是 csv 格式:

"Date,Credit,Debit,Balance,20/01/2019,,9.00,162.00,20/01/2019,90.00,,171.00,20/01/2019,,9.00,81.00,20/01/2019,90.00,,90.00"

【问题讨论】:

标签: javascript arrays csv replace


【解决方案1】:

另一种方法,可能是使用新的实验性flatMap() 将每个string 映射到由|| 拆分的数组,然后将trim() 应用于这个新数组的每个元素以删除额外的空格,这个新的然后将数组展平,最后我们可以将所有元素与,连接起来,以获得所需的伪CSV。请注意,这种方法会保留相关空格,例如Date And Time 不会更改为DateAndTime

let transactions = [
    "   Date And Time     ||  Credit   ||  Debit   ||  Balance  ",
    "20/01/2019 09:57:00  ||          ||  9.00  ||  162.00",
    "20/01/2019 10:20:12 ||  90.00  ||          ||  171.00",
    "20/01/2019 14:17:30 ||          ||  9.00  ||  81.00",
    "20/01/2019 21:00:30 ||  90.00  ||          ||  90.00"
];

let out = transactions.flatMap(str => str.split("||").map(e => e.trim())).join(",");

console.log(out);

但是,如果你想要一个真正的CSV 格式:

CSV 是一种分隔数据格式,其字段/列由逗号分隔,记录/行由换行符终止。

然后,您应该考虑将new line (\n) 字符添加到每个新数据行中,就像在下一个方法中一样:

let transactions = [
    "   Date And Time     ||  Credit   ||  Debit   ||  Balance  ",
    "20/01/2019 09:57:00  ||          ||  9.00  ||  162.00",
    "20/01/2019 10:20:12 ||  90.00  ||          ||  171.00",
    "20/01/2019 14:17:30 ||          ||  9.00  ||  81.00",
    "20/01/2019 21:00:30 ||  90.00  ||          ||  90.00"
];

let out = transactions.map(
    str => str.split("||").map(e => e.trim()).join(",")
).join("\n");

console.log(out);

【讨论】:

    【解决方案2】:

    您可以使用此代码:

    let output = transactions.join('||').replace(/\s/g, '').replace(/\|\|/g, ',');
    

    【讨论】:

      【解决方案3】:

      您可以通过|| 加入数组元素,并根据捕获的组返回'', 使用替换和回调使用函数。

      这将节省您使用两次替换的时间。

      let str = ["   Date     ||  Credit   ||  Debit   ||  Balance  ", "20/01/2019  ||          ||  9.00  ||  162.00", "20/01/2019  ||  90.00  ||          ||  171.00", "20/01/2019  ||          ||  9.00  ||  81.00", "20/01/2019  ||  90.00  ||          ||  90.00"];
      
      let op = str.join('||').replace(/(\s+)|(\|\|)/g,
         function(match,firstMatch, secondMatch){
         return firstMatch ? '' : ','
      })
      console.log(op)

      【讨论】:

        【解决方案4】:

        您可以这样做以将所有 '||' 字符串替换为 ',' 字符:

        let output = transactions.split('||').join(',')
        

        您的第一个 .replace 似乎也没有添加“||”在数组中的元素之间,所以我建议首先使用transactions.join('||'),然后继续使用你的.replace,然后是我上面的代码。

        完整的代码如下所示:

        let transactions = [
            "   Date     ||  Credit   ||  Debit   ||  Balance  ",
            "20/01/2019  ||          ||  9.00  ||  162.00",
            "20/01/2019  ||  90.00  ||          ||  171.00",
            "20/01/2019  ||          ||  9.00  ||  81.00",
            "20/01/2019  ||  90.00  ||          ||  90.00"
        ];
        
        let output = transactions.join('||') // 1. combine array with 2 '|' chars
            .replace(/\s/g, '')              // 2. remove all space characters
            .split('||').join(',');          // 3. replace '||' str with ','
        
        console.log(output);

        如果你想坚持使用.replace 函数,你可以使用:

        let output = transactions.replace(/\|{2}/g, ',');
        

        这匹配两个相邻的 '|' 字符实例,在原始字符串中的任何位置,并将它们替换为 ','。它与您所拥有的非常相似,但是正如@Dan Dascalescu 所提到的,您必须转义正则表达式中的| 字符,您必须摆脱{2,} 中的逗号,如这将匹配 2 个或更多 '|' 字符。

        下面是完整代码的样子:

        let transactions = [
            "   Date     ||  Credit   ||  Debit   ||  Balance  ",
            "20/01/2019  ||          ||  9.00  ||  162.00",
            "20/01/2019  ||  90.00  ||          ||  171.00",
            "20/01/2019  ||          ||  9.00  ||  81.00",
            "20/01/2019  ||  90.00  ||          ||  90.00"
        ];
        
        let output = transactions.join('||') // 1. combine array with 2 '|' chars
            .replace(/\s/g, '')              // 2. remove all space characters
            .replace(/\|{2}/g, ',');         // 3. replace '||' with ','
        
        console.log(output);

        【讨论】:

          【解决方案5】:

          我很少使用正则表达式,但我希望 .replace(/\|+/g,",") 能够工作。 (它应该找到任意数量的连续管道字符并用单个逗号替换批次。)

          【讨论】:

            猜你喜欢
            • 2013-05-05
            • 1970-01-01
            • 1970-01-01
            • 2016-03-07
            • 2013-04-27
            • 2023-03-18
            • 2023-03-14
            • 2020-03-26
            • 1970-01-01
            相关资源
            最近更新 更多