我正在使用以下内容解析 csv 文件csv 解析 https://csv.js.org/parse/ -
userID,sysID
20,50
30,71
但是,在返回的对象上,无法访问从第一列创建的属性userID
.
这是我的代码——
async function main(){
let systemIDs = await getSystemIds('./systems.csv');
console.log(`Scanning data for ${systemIDs.length} systems..`);
console.log(systemIDs[0]);
console.log(systemIDs[0].userID); // This prints undefined
console.log(systemIDs[0].sysID); // This prints the correct value
}
async function getSystemIds(path){
let ids= [];
await new Promise ((resolve,reject)=>{
const csvParser = csvParse({columns:true, skip_empty_lines: true});
FS.createReadStream(path)
.pipe(csvParser)
.on('readable', ()=>{
let record ;
while(record = csvParser.read()) {
ids.push(record);
}
})
.on('finish',()=>{
resolve();
});
});
return ids;
}
Output -
Scanning data for 2 systems..
{ 'userID': '20', sysID: '50' }
undefined // <== The Problem
50
我注意到第一列键userID
在控制台输出中有单引号,而sysID
没有。但不知道是什么原因造成的。
最后我自己想通了...
我需要bom
选项。这文档 https://csv.js.org/parse/options/bom/#hidden-bom-in-output声明对于 UTF-8 文件应将其设置为 true。但默认设置为 false。
MS Excel 生成的 CSV 文件中包含隐藏的 BOM 字符。解析器将其作为标头(和键名称)的一部分拾取。
将 bom 选项设置为 true 会使 csv-parse 与包含或不包含 bom 字符的 utf-8 文件兼容。
初始化 csv-parse 时设置 bom 选项 -
const csvParser = csvParse({
columns: true,
skip_empty_lines: true,
bom: true
});
我不太清楚为什么 Excel 将这个 bom 字符添加到 csv 文件中。引用自维基百科BOM https://en.wikipedia.org/wiki/UTF-8#Byte_order_mark -
Unicode 标准既不要求也不建议对 UTF-8 使用 BOM,但警告可能会在从另一种编码转码的文件开头遇到该 BOM
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)