我正在尝试将数据写入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看起来很奇怪(它没有居中并且在文件的左上方)
答案 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中,您都可以使用数据导入功能,并更好地控制如何处理导入文件的语法。
里程可能会随其他应用程序而变化,但是在任何情况下双引号都是首选。