Node.js解析CSV生成的JavaScript对象无法访问Name属性求助
问题原因
你访问不到Name属性的核心原因是CSV文件头部携带了UTF-8 BOM(字节顺序标记),这是一个Unicode编码为U+FEFF的零宽不可见字符,会附加在解析后对象的第一个键名开头。你肉眼看到的键名是Name,实际完整键名是\ufeffName,和你输入的纯Name字符串不匹配,所以返回undefined。
验证方法
你可以执行以下代码确认问题:
const firstKey = Object.keys(data)[0] // 打印第一个键的首个字符Unicode编码,输出为feff即可确认是BOM导致的问题 console.log(firstKey.charCodeAt(0).toString(16))
解决方法
方法1:解析CSV前先去除BOM(推荐)
使用strip-bom-stream依赖在读取文件流时直接去掉BOM,再交给CSV解析器处理:
const stripBom = require('strip-bom-stream'); fs.createReadStream("data.csv") .pipe(stripBom()) .pipe(csv()) .on("data", (data) => { // 此时可直接正常访问data["Name"] })
多数常用的Node.js CSV解析库也自带BOM处理配置,你可以直接在csv()初始化时添加bom: true参数开启自动去除BOM的功能。
方法2:拿到数据后手动清理键名
如果不想新增依赖,也可以在拿到单条数据后统一去除所有键名开头的BOM字符:
const cleanData = Object.fromEntries( Object.entries(data).map(([key, val]) => [key.replace(/^\ufeff/, ''), val]) ) console.log(cleanData["Name"]) // 正常输出Niger
内容的提问来源于stack exchange,提问作者OkOutside84
相关产品推荐
相关产品推荐

