如何让PapaParse正确解析以双引号开头的CSV值?
处理PapaParse解析以双引号开头的CSV值异常问题
问题场景
使用最新版PapaParse解析大型制表符分隔(TSV)文件时,工具能正常处理值内部的双引号,但无法正确解析以双引号开头的值,导致后续行被错误合并到当前字段中。
解析代码
const parsePromise = new Promise<void>((resolve, reject) => { Papa.parse<Equipment>(fileStream, { header: true, delimiter: "\t", dynamicTyping: true, skipEmptyLines: true, step: (result) => { const rowData = { vehicle_id: result.data.vehicle_id, schema_id: result.data.schema_id, option_id: result.data.option_id, record_id: result.data.record_id, location: result.data.location, data_value: result.data.data_value, condition: result.data.condition, }; entities.push(rowData); console.log(rowData) }, complete: () => resolve(), error: (error) => reject(error), }); });
异常触发的TSV数据
vehicle_id schema_id option_id record_id location data_value condition 425972620240523 15102 1266 7700 W "Första hjälpen"- förbandslåda med varningstriangel, 2 varselvästar 425972620240523 15104 1266 7700 W W 425972620240523 15101 1266 7800 INT S 425972620240523 15102 1266 7800 INT medical kit, warning triangle, 2 safety vests 425972620240523 15104 1266 7800 INT INT 425972620240523 15101 1267 7900 W S 425972620240523 15102 1267 7900 W Papperskorg (borttagbar)
异常解析输出
{ vehicle_id: 425972620240523, schema_id: 15102, option_id: 1266, record_id: 7700, location: 'W', data_value: 'Första hjälpen"- förbandslåda med varningstriangel, 2 varselvästar\t\r\n' + '425972620240523\t15104\t1266\t7700\tW\tW\t\r\n' + '425972620240523\t15101\t1266\t7800\tINT\tS\t\r\n' + '425972620240523\t15102\t1266\t7800\tINT\tmedical kit, warning triangle, 2 safety vests\t\r\n' + '425972620240523\t15104\t1266\t7800\tINT\tINT\t\r\n' + '425972620240523\t15101\t1267\t7900\tW\tS\t\r\n' + '425972620240523\t15102\t1267\t7900\tW\tPapperskorg (borttagbar)\t\r\n', condition: undefined }
双引号在值内部时的正常情况
当双引号位于值中间时,解析结果正常:
修正后的TSV数据
vehicle_id schema_id option_id record_id location data_value condition 425972620240523 15102 1266 7700 W Första "hjälpen"- förbandslåda med varningstriangel, 2 varselvästar 425972620240523 15104 1266 7700 W W 425972620240523 15101 1266 7800 INT S 425972620240523 15102 1266 7800 INT medical kit, warning triangle, 2 safety vests 425972620240523 15104 1266 7800 INT INT 425972620240523 15101 1267 7900 W S 425972620240523 15102 1267 7900 W Papperskorg (borttagbar)
正常解析输出
{ vehicle_id: 425972620240523, schema_id: 15102, option_id: 1266, record_id: 7700, location: 'W', data_value: 'Första "hjälpen"- förbandslåda med varningstriangel, 2 varselvästar', condition: null } { vehicle_id: 425972620240523, schema_id: 15104, option_id: 1266, record_id: 7700, location: 'W', data_value: 'W', condition: null } ....
解决方案
原因分析
PapaParse遵循RFC 4180标准:当字段以双引号开头时,会判定该字段为带引号字段,必须找到对应的闭合双引号才会结束字段解析。你的数据仅在字段开头添加了双引号,没有闭合,导致解析器将后续所有行都当作当前字段的内容。
调整方案
有两种可行的处理方式:
修正源数据格式
给以双引号开头的字段添加闭合双引号,符合标准格式:425972620240523 15102 1266 7700 W "Första hjälpen"- förbandslåda med varningstriangel, 2 varselvästar"配置PapaParse禁用引号解析
如果无法修改源数据,可以在解析配置中添加quoteChar: false,完全禁用引号解析逻辑,让PapaParse将双引号当作普通字符处理:const parsePromise = new Promise<void>((resolve, reject) => { Papa.parse<Equipment>(fileStream, { header: true, delimiter: "\t", dynamicTyping: true, skipEmptyLines: true, quoteChar: false, // 新增:禁用引号解析 step: (result) => { const rowData = { vehicle_id: result.data.vehicle_id, schema_id: result.data.schema_id, option_id: result.data.option_id, record_id: result.data.record_id, location: result.data.location, data_value: result.data.data_value, condition: result.data.condition, }; entities.push(rowData); console.log(rowData) }, complete: () => resolve(), error: (error) => reject(error), }); });注意:禁用引号解析后,所有双引号都会被视为普通字符,如果你有需要保留的带引号字段(比如包含分隔符的字段),此方法不适用,优先选择修正源数据格式。
内容的提问来源于stack exchange,提问作者4integration
相关产品推荐
相关产品推荐

