Javascript 如何将包含逗号的字符串写入CSV?
我正在尝试将数据写入csv文件。数据始终是字符串,但有时包含逗号。如何在写入csv文件时包含逗号,而不将其分隔为不同的列?我正在使用fs模块创建csv文件。我想解释一下,如果你使用正则表达式,因为我不太熟悉它Javascript 如何将包含逗号的字符串写入CSV?,javascript,node.js,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'), tes
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看起来很奇怪(它没有居中,也没有向上向左)简单的回答是,您需要在任何包含逗号(或双引号,或新行)的值周围加上双引号 当然,这引出了一个新问题:如果单元格中有双引号怎么办?答案是,这些双引号需要用另一个双引号转义
['test","5','test","6','test","7']
---- should become ----
"test"",""5","test"",""6","test"",""7"
有关更多详细信息,请参阅。虽然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格式化过程委托给专门从事这类工作的库是值得的。例如,您只需将输入映射到json对象,然后告诉解析器要在这些对象上输出哪些字段。根据您的要求: 我希望输出看起来像(|用于分隔为列) 测试1 |测试2 |测试3 假设将单独考虑评论中指出的规则,下面是最简单的解决方案:
const testArr=['test1'、'test,2'、'test3']、['test1'、'test2'、'test3']、['test1'、'test2'、'test3']、['test1'、'test2'、'test3'];
const barSeparatedValues=testArr.map(arr=>arr.join(“|”).join(“\n”);
console.log(barSeparatedValues)代码>StriplingWarrior建议的双引号用于将文件读入MS Excel,如果双引号可能出现在字符串中,则需要使用两个双引号来转义任何双引号
我刚刚在Excel中进行了测试,在使用Excel打开csv文件时,多个逗号不算作分隔符。在MS Access和Excel中,您都可以使用数据导入功能,并可以更好地控制要导入的文件的语法处理方式
里程数可能因其他应用程序而异,但在任何情况下,双引号都是第一个猜测。最好是循环数组并将其写入csv文件?它仍然无法解决逗号问题:(为什么要用换行符加入数组(\n
),当您要创建逗号分隔的输出时?最终值将类似于<代码>[]、[]、[]、[]、[]、[]、[]、[]、[]、[]]
和加入\n
会将它们分成不同的行。我已经用双引号进行了测试。我将更新我的问题以包括我的测试。忘记了我已经进行了测试。我将查看您的库specified@RTran25当前位置我把我的答案充实了一点。我想说这很接近,但仍然有错误将数组内的数据标记为[[“测试”、“5”、“测试”、“6”、“测试”、“7”]]
由于逗号周围的双引号而导致错误。我也测试了您编写的代码,但csv文件的值很奇怪。测试%22%2C%225
位于第一列,第二列和第三列分别以226和227结尾。我将继续测试更多代码,希望能找到解决此问题的答案我只是想在不导入库的情况下解决这个问题,但是如果没有选择,我会的