将字符串数组转换为csv格式

时间:2019-01-20 11:19:59

标签: javascript arrays csv 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"
];

我使用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"

5 个答案:

答案 0 :(得分:2)

您可以执行以下操作,将所有'||'字符串替换为',' char:

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所提到的,您必须转义正则表达式中的|字符,并且您必须摆脱{{1}中的逗号},因为它将匹配2个或更多{2,}个字符。

这是完整代码中的样子:

'|'

答案 1 :(得分:2)

另一种方法可能是使用新的实验性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 :(得分:0)

我不太使用正则表达式,但是我希望.replace(/\|+/g,",")可以正常工作。 (它应该找到任意数量的连续竖线字符,并用一个逗号替换很多字符。)

答案 3 :(得分:0)

您可以使用以下代码:

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

答案 4 :(得分:0)

您可以通过||连接数组元素,并根据捕获的组返回'',使用replace和在回调使用函数中使用。

这将为您节省两次替换。

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)