功能说明
按逗号 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。空行应返回一个空字符串字段,连续分隔符应产生多个空字段。