JavaScript CSV转数组时如何避免拆分双引号内部的逗号
问题根因
你当前的实现逻辑没有遵循CSV标准转义规则:被双引号包裹的字段内部的逗号不属于字段分隔符,而你提前删除所有引号、直接按逗号拆分的逻辑会直接把这类字段拆成多个值,最终导致字段映射错位。
修复后代码
function csvToArray(str, delimiter = ",") { // CSV字段匹配正则:优先匹配双引号包裹的内容,忽略内部的分隔符 const csvFieldRegex = new RegExp( `(\\s*"[^"]*"\\s*|[^${delimiter}]+)`, 'g' ); // 处理表头 const headerRow = str.slice(0, str.indexOf("\n")); let headers = headerRow.match(csvFieldRegex).map(field => field.replace(/["\s]+/g, '').replace(/[^A-Z0-9]+/ig, "_") ); // 提取有效数据行 const rows = str.slice(str.indexOf('\n') + 1).split('\n').filter(row => row.trim()); // 映射为对象数组 return rows.map(row => { const values = row.match(csvFieldRegex).map(field => // 仅去除字段首尾的包裹引号,保留内部合法内容 field.trim().replace(/^"|"$/g, '') ); return headers.reduce((obj, header, index) => { obj[header] = values[index] ?? ''; return obj; }, {}); }); }
核心修改点
- 新增CSV字段专用匹配规则,自动识别被双引号包裹的内容,不会把内部的逗号当做分隔符拆分
- 取消全局删除所有引号的逻辑,仅清理每个字段首尾的包裹引号,保留字段内部的正常内容
- 新增空行过滤和缺省值兜底,避免空行、字段缺失时生成无效数据
内容的提问来源于stack exchange,提问作者Nick Gallagher
相关产品推荐
相关产品推荐

