Node.js中使用csv-parse模块如何忽略双引号内的分隔符
解决方案
问题根因
你的csv-parse配置没有显式指定双引号作为字段包裹符,导致模块没有忽略双引号内部的分隔符,直接把01|0009里的|识别成了列分隔符,把原本的第二列切成了两部分,最终出现行长度不一致的报错。
修改步骤
- 调整
parseCsv的配置参数,显式指定双引号为包裹符,开启引号内部内容不解析分隔符的逻辑 - 补充Promise的错误 reject 逻辑,避免异常时Promise一直处于 pending 状态
修改后的getData函数代码
const getData = (data, delimiter) => { return new Promise((resolve, reject) => { const rows = [] const rtrim = delimiter === '|' || delimiter === '@'? false : true const parser = parseCsv( data, { delimiter, relax: true, ltrim: true, rtrim, // 新增以下两个配置 quote: '"', // 显式指定双引号为字段包裹符,内部的分隔符会被自动忽略 relax_quotes: true // 可选,兼容未闭合的引号场景,根据你的实际数据选择开启 } ) parser.on('readable', () => { for(let data = parser.read(); data; data = parser.read()){ rows.push(data) } }) parser.on('end', () => { resolve( delimiter === '|' ? rows : rows.flat(1) ) }) parser.on('error', err => { console.log(err) reject(err) // 补充错误抛出逻辑 }) }) }
如果你使用的是5.x及以上版本的csv-parse,需将
relax_quotes替换为驼峰格式的relaxQuotes。
效果说明
修改后第一层用|解析时,会自动跳过双引号内部的|,样例数据的第二行会正确解析为2列,不会再触发长度不匹配的报错。后续用@、;解析的逻辑也会自动跳过对应分隔符在双引号内的情况,符合你的解析需求。
内容的提问来源于stack exchange,提问作者Gabriel Lüders
相关产品推荐
相关产品推荐

