无法从 CSV 文件访问 JavaScript 对象 属性
Unable to access JavaScript Object property from CSV file
我很难弄清楚如何访问我的 javascript 对象的 属性。
我有一个 Node JS 应用程序,它从 WHO 下载一个包含 covid 数据的 CSV 文件,然后循环遍历每个条目。以下是我如何遍历每个 CSV 条目:
fs.createReadStream("data.csv")
.pipe(csv())
.on("data", (data) => {
//process data
})
.on("end", () => {
});
这是我 运行 console.log(data)
时的输出示例之一
{
'Name': 'Niger',
'WHO Region': 'Africa',
'Cases - cumulative total': '6203',
'Cases - cumulative total per 100000 population': '25.63',
'Cases - newly reported in last 7 days': '64',
'Cases - newly reported in last 7 days per 100000 population': '0.26',
'Cases - newly reported in last 24 hours': '10',
'Deaths - cumulative total': '205',
'Deaths - cumulative total per 100000 population': '0.85',
'Deaths - newly reported in last 7 days': '1',
'Deaths - newly reported in last 7 days per 100000 population': '0',
'Deaths - newly reported in last 24 hours': '0'
}
如果我 运行 typeof data
我得到 object
.
我想访问这个对象的一些属性。
如果我输出 data["WHO Region"]
我得到“非洲”。所以这有效。
但是,我无法访问那些对象的名称。
console.log(data["Name"]);
console.log(data.hasOwnProperty("Name"));
分别输出undefined
和false
即使对象中存在名称 属性。
我也尝试用 Object.keys(data) 列出对象的键,结果如下:
[ 'Name', 'WHO Region', 'Cases - cumulative total', ... ]
显然密钥名称确实存在,但由于某种原因我无法访问它。
我是不是遗漏了什么?
您在对象的 Name
属性 中有不可见符号。你可以在浏览器控制台中查看 console.log
的结果:
检查您的原始 CSV 文件并搜索这个不可见字符。
编辑: 这个符号是 ZWNBSP (Zero Width No-Break Space) 在文件的开头。
问题是由 Byte Order Mark (BOM) at the start of the file, represented by the byte sequence 0xEF,0xBB,0xBF
corresponding to the UTF-8 codepoint U+FEFF.
引起的
您的代码的一个简单解决方法是像这样替换它:
const results = [];
fs.createReadStream('data.csv')
.pipe(csv())
.on('data', (data) => {
// Replace BOM in key
const key1 = Object.keys(data)[0];
data = { ...data, [key1.replace(/\uFEFF/, '')]: data[key1] };
results.push(data);
})
.on('end', () => {
results.forEach(result => {
console.log(`Name: ${result["Name"]}`);
})
});
或
您可以在 Nodepad++ 中打开文件并使用 Encoding
菜单将其从 UTF-8-BOM 更改为 UTF-8 并保存。
我很难弄清楚如何访问我的 javascript 对象的 属性。
我有一个 Node JS 应用程序,它从 WHO 下载一个包含 covid 数据的 CSV 文件,然后循环遍历每个条目。以下是我如何遍历每个 CSV 条目:
fs.createReadStream("data.csv")
.pipe(csv())
.on("data", (data) => {
//process data
})
.on("end", () => {
});
这是我 运行 console.log(data)
{
'Name': 'Niger',
'WHO Region': 'Africa',
'Cases - cumulative total': '6203',
'Cases - cumulative total per 100000 population': '25.63',
'Cases - newly reported in last 7 days': '64',
'Cases - newly reported in last 7 days per 100000 population': '0.26',
'Cases - newly reported in last 24 hours': '10',
'Deaths - cumulative total': '205',
'Deaths - cumulative total per 100000 population': '0.85',
'Deaths - newly reported in last 7 days': '1',
'Deaths - newly reported in last 7 days per 100000 population': '0',
'Deaths - newly reported in last 24 hours': '0'
}
如果我 运行 typeof data
我得到 object
.
我想访问这个对象的一些属性。
如果我输出 data["WHO Region"]
我得到“非洲”。所以这有效。
但是,我无法访问那些对象的名称。
console.log(data["Name"]);
console.log(data.hasOwnProperty("Name"));
分别输出undefined
和false
即使对象中存在名称 属性。
我也尝试用 Object.keys(data) 列出对象的键,结果如下:
[ 'Name', 'WHO Region', 'Cases - cumulative total', ... ]
显然密钥名称确实存在,但由于某种原因我无法访问它。 我是不是遗漏了什么?
您在对象的 Name
属性 中有不可见符号。你可以在浏览器控制台中查看 console.log
的结果:
检查您的原始 CSV 文件并搜索这个不可见字符。
编辑: 这个符号是 ZWNBSP (Zero Width No-Break Space) 在文件的开头。
问题是由 Byte Order Mark (BOM) at the start of the file, represented by the byte sequence 0xEF,0xBB,0xBF
corresponding to the UTF-8 codepoint U+FEFF.
您的代码的一个简单解决方法是像这样替换它:
const results = [];
fs.createReadStream('data.csv')
.pipe(csv())
.on('data', (data) => {
// Replace BOM in key
const key1 = Object.keys(data)[0];
data = { ...data, [key1.replace(/\uFEFF/, '')]: data[key1] };
results.push(data);
})
.on('end', () => {
results.forEach(result => {
console.log(`Name: ${result["Name"]}`);
})
});
或
您可以在 Nodepad++ 中打开文件并使用 Encoding
菜单将其从 UTF-8-BOM 更改为 UTF-8 并保存。