由 csv-parse 解析的第一个 属性 对象无法访问
First property inaccsesible of objects parsed by csv-parse
我正在使用 csv-parse -
解析包含以下内容的 csv 文件
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;
}
输出-
Scanning data for 2 systems..
{ 'userID': '20', sysID: '50' }
undefined // <== The Problem
50
我注意到第一列键 userID
在控制台输出中有单引号,而 sysID
没有。但不知道是什么原因造成的。
最后自己想出来了...
我需要 BOM 选项。 documentation 声明对于 UTF-8 文件应将其设置为 true。但它默认为 false。
Excel 默认生成以 BOM 作为 CSV 文件中第一个字符的 csv 文件。这被解析器作为 header (和键名)的一部分。
将 bom 选项设置为 true,它可以处理从 excel 或其他程序生成的 csv 文件。
const csvParser = csvParse({
columns: true,
skip_empty_lines: true,
bom: true
});
我正在使用 csv-parse -
解析包含以下内容的 csv 文件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;
}
输出-
Scanning data for 2 systems..
{ 'userID': '20', sysID: '50' }
undefined // <== The Problem
50
我注意到第一列键 userID
在控制台输出中有单引号,而 sysID
没有。但不知道是什么原因造成的。
最后自己想出来了...
我需要 BOM 选项。 documentation 声明对于 UTF-8 文件应将其设置为 true。但它默认为 false。
Excel 默认生成以 BOM 作为 CSV 文件中第一个字符的 csv 文件。这被解析器作为 header (和键名)的一部分。 将 bom 选项设置为 true,它可以处理从 excel 或其他程序生成的 csv 文件。
const csvParser = csvParse({
columns: true,
skip_empty_lines: true,
bom: true
});