You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

NodeJS解析含非规范数据、重载分隔符的CSV文件方法咨询

问题背景

需要解析分号分隔的CSV数据集,部分字段被双引号包裹,且字段值内部包含分隔符;,直接按;分割字段会出错。现有手动提取引号内子串的方案无法判断非规范数据所属列,最终需要将解析后的数据分别存入goes_to_multimap、comes_from_multimap两个结构,支持按人名查询对应城市列表。

原始CSV示例:

Name;goes_to;comes_from
Peter;;London
Ruth;Boston;
Brandon;;
John;;"Bern;Madrid;Tel Aviv"
David;"New York;Paris;Berlin";

预期存储效果:

comes_from_multimap.get('John'); >>> ['Bern', 'Madrid', 'Tel Aviv']
goes_to_multimap.get('David') >>> ['New York','Paris','Berlin']
最优解决方案

不要手动实现CSV拆分逻辑。双引号包裹转义字段内的分隔符是CSV格式的标准规范,所有成熟的CSV解析库都原生支持该特性,不需要自己写字符串截取、判断逻辑,几行代码就能解决问题。
具体实现步骤:

  • 引入当前所用编程语言对应的成熟CSV解析组件,配置两个核心参数:字段分隔符设为;,开启双引号字段识别/转义功能。如果读取到的原始文本里双引号被转义为",先全局替换为普通双引号"再送入解析器处理。
  • 逐行读取CSV时,解析器会自动正确拆分每一行的三个字段,完全忽略引号包裹字段内部的;,同时自动去掉字段外层包裹的双引号,不会出现字段拆分错位的问题。
    以问题中的两行异常数据为例,解析器自动拆分的结果如下:
    • John行拆分结果:Name=John,goes_to=空值,comes_from=Bern;Madrid;Tel Aviv
    • David行拆分结果:Name=David,goes_to=New York;Paris;Berlin,comes_from=空值
  • 逐行遍历拆分结果做二次处理:
    • 若当前行goes_to字段非空,按;将字段值拆分为城市列表,以当前行Name为key存入goes_to_multimap
    • 若当前行comes_from字段非空,按;将字段值拆分为城市列表,以当前行Name为key存入comes_from_multimap
原有方案的缺陷

你之前使用的line.substring(line.indexOf("\"") + 1, line.lastIndexOf("\""))逻辑,本质是跳过了CSV的结构化字段拆分步骤,直接全局匹配行内的引号位置提取内容,自然无法关联内容对应的列信息。只要先用标准CSV解析器完成第一层字段拆分,字段归属关系是完全明确的,根本不会出现无法判断列的问题。


内容的提问来源于stack exchange,提问作者A.T.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 17:39:19