csv 解析后对象的键名(如 `'bookmaker'`)可能包含肉眼难辨的前后空格,导致 `data.bookmaker` 失败;必须用 `trim()` 清理键名后,再通过方括号语法安全访问。
在使用 csv-parser(如 csv npm 包)解析 CSV 文件时,库默认将第一行作为表头(headers),并据此生成每行数据的对象(data)。但若原始 CSV 文件的首行存在隐藏空格(例如 "Bookmaker "; 或 " Bookmaker"),这些空格会被完整保留在键名中——于是实际键名为 'Bookmaker '(末尾有空格)或 ' Bookmaker'(开头有空格),而非干净的 'Bookmaker'。
此时,data.Bookmaker

✅ 正确做法是:在首次读取数据后,统一清洗所有键名,并建立标准化映射:
const fs = require('fs');
const csv = require('csv-parser');
const dataRows = [];
const filePath = './bets.csv';
fs.createReadStream(filePath)
.pipe(csv({ separator: ';' }))
.on('data', (row) => {
dataRows.push(row);
})
.on('end', () => {
// 1. 提取首行原始键名并去空格
const rawKeys = Object.keys(dataRows[0]);
const cleanKeys = rawKeys.map(key => key.trim());
// 2. 构建原始键 → 清洗键的映射表(保留原始结构兼容性)
const keyMap = {};
rawKeys.forEach((rawKey, i) => {
keyMap[rawKey] = cleanKeys[i];
});
// 3. 安全访问:先按原始键取值,再用清洗后的键名做逻辑判断
dataRows.forEach((row, index) => {
const bookmakerValue = row[rawKeys.find(k => keyMap[k] === 'Bookmaker')];
console.log(`Row ${index + 1} Bookmaker:`, bookmakerValue || '(empty)');
});
// ✅ 更推荐:批量重写数据对象,统一使用清洗后键名
const normalizedData = dataRows.map(row => {
const normalized = {};
Object.entries(row).forEach(([rawKey, value]) => {
normalized[keyMap[rawKey]] = value;
});
return normalized;
});
// 此后可安全使用点语法或标准 bracket 语法
normalizedData.forEach(item => {
console.log('✅ Clean access:', item.Bookmaker); // 现在完全可用!
});
});⚠️ 注意事项:
总结:CSV 解析的“不可访问”问题本质是键名污染,而非语法限制。通过清洗键名、构建映射或启用解析器内置 trim 选项,即可彻底解决,并保障后续数据库写入的健壮性。