← 中文资源

简体中文版本

支持引号字段的 CSV 行解析器

逐字符解析单行 CSV,支持自定义分隔符、引号包裹字段和双写引号,并对未闭合引号等畸形输入抛错。

阅读英文原文

功能说明

按逗号 split 无法处理带逗号、引号或空格的字段,会把一条记录拆坏。该函数逐字符扫描一行 CSV,支持引号包裹字段和连续两个引号表示的转义引号,并在引号未闭合或分隔符非法时抛错,适合导入小型配置和表格数据。

关键代码

状态变量 quoted 表示当前是否处于引号内。引号内遇到双引号时向后看一位,若是双引号则写入一个引号并跳过,否则结束引用。引号外仅在字段为空时把双引号视为引用起点,其余字符直接追加或按分隔符切分。

if (quoted) {
  if (char === '"') {
    if (line[index + 1] === '"') { field += '"'; index += 1; }
    else quoted = false;
  } else field += char;
}

使用注意

该函数只解析一行,不处理跨行字段;包含换行的字段应先按 CSV 记录拆分。字段前后的空格会保留,是否裁剪由调用方决定。分隔符不能是双引号。未闭合引号会抛 RangeError。末尾分隔符会产生一个空字段,这是有意保留的行为。

验证方式

断言 parseCsvRow(‘a,“b,c”,d’) 返回 [“a”, “b,c”, “d”]。parseCsvRow(‘“a”“b”,c’) 返回 [‘a“b’, “c”]。未闭合引号抛 RangeError,分隔符长度不为 1 抛 RangeError。空行应返回一个空字符串字段,连续分隔符应产生多个空字段。