如何将包含逗号的字符串写入CSV?

时间:2019-06-07 16:07:00

标签: javascript node.js

我正在尝试将数据写入csv文件。数据将始终是字符串,但有时包含逗号。写入csv文件时如何在不将逗号分隔为不同列的情况下添加逗号?我正在使用fs模块创建csv文件。如果您使用的是正则表达式,请给我一个解释,因为我不太熟悉。

const fs = require('fs');

let testArr = ['test1','test,2','test3'];

async function main(){
    try{
        fs.writeFile(('./testCsv.csv'), testArr.join("\n"), 'utf8', function (err){
            if(err) throw err;
            console.log('Saved!');
        });
    }
}

我希望输出看起来像(|用于分隔为列)test1|test,2|test3 但它看起来像 test1|test|2|test3

我尝试过的一件事是

const fs = require('fs');

let testArr = ['test","5','test","6','test","7'];

async function main(){
    try{
        fs.writeFile(('./testCsv.csv'), testArr.join("\n"), 'utf8', function (err){
            if(err) throw err;
            console.log('Saved!');
        });
    }
}

但输出看起来像

test"|5,test|6,test|7

文件中的7看起来很奇怪(它没有居中并且在文件的左上方)

3 个答案:

答案 0 :(得分:0)

简短的答案是,您需要在任何包含逗号的值(或双引号或换行符)周围加上双引号。

当然,这引入了一个新问题:如果单元格中有双引号怎么办?答案是那些双引号需要用另一个双引号转义。

['test","5','test","6','test","7']
---- should become ----
"test"",""5","test"",""6","test"",""7"

有关更多详细信息,请参见Channel.sendMessage()。尽管没有CSV的官方标准,但这些标准已得到足够频繁的遵守,因此可能会适合您的用例。

我没有正在运行的节点,但是遵循以下原则可能会起作用:

const fs = require('fs');

let testArr = [ ['test","5','test","6','test","7'] ];

function escape(value)
{
     if(!['"','\r','\n',','].some(e => value.indexOf(e) !== -1)) {
         return value;
     }
     return '"' + value.replace(/"/g, '""') + '"';
}

async function main(){
    try{
        let lines = testArr
            .map(line => line.map(cell => escape(cell)).join(","));
        fs.writeFile(('./testCsv.csv'), lines.join("\n"), 'utf8', function (err){
            if(err) throw err;
            console.log('Saved!');
        });
    }
}

关于正则表达式/"/g

  • 正斜杠(/)告诉JavaScript您正在制作正则表达式。它们之间的一切都是正则表达式模式。它们后面的字符是标志。
  • "说,您正在尝试查找双引号字符
  • 斜杠后的g标志表示您想替换所有出现的模式,而不仅仅是遇到的第一个模式。

我还没有测试过,即使它可以工作,我也不能保证它在所有情况下都可以工作。您可能会发现将整个CSV格式的处理过程委派给专门从事此类工作的图书馆是值得的。例如,the Basic Rules of CSV仅需要将输入映射到json对象,然后告诉解析器要在这些对象上输出哪些字段。

答案 1 :(得分:0)

给出您的要求:

  

我希望输出看起来像(|用于分隔为列)   test1 | test,2 | test3

并且假设注释中指出的规则将被单独考虑,这是最简单的解决方案:

const testArr = [['test1','test,2','test3'],['test1','test,2','test3'],['test1','test,2','test3'],['test1','test,2','test3']];

const barSeparatedValues = testArr.map(arr=>arr.join("|")).join("\n");

console.log(barSeparatedValues);

请注意,有四个“行”数据用换行符分隔,而“列”则用|分隔。

答案 2 :(得分:0)

StriplingWarrior建议使用双引号将文件读入MS-Excel,如果可能出现在字符串中,则必须使用2个双引号将任何双引号转义。

我刚刚在Excel中对其进行了测试,并且仅使用Excel打开csv文件时,多个逗号不算作分隔符。在MS-Access和Excel中,您都可以使用数据导入功能,并更好地控制如何处理导入文件的语法。

里程可能会随其他应用程序而变化,但是在任何情况下双引号都是首选。