导入前清理文本:会弄坏流水线的隐藏字符
导入前清理文本:会弄坏流水线的隐藏字符
BOM、不换行空格、智能引号和混用的换行符在解析器拒绝文件之前都看不见。该删什么、该留什么。
原创流程图
导入前清理文本:会弄坏流水线的隐藏字符
理解原理
检查后再进入下一步
检查边界
检查后再进入下一步
使用工具
检查后再进入下一步
UTF-8 BOM 是三个字节 EF BB BF。很多 Windows 工具会写入它;很多 Unix 解析器会因此把第一个字段名当成未知列。用十六进制视图或能明确显示 BOM 的工具打开。若存在,导入前删掉。不要在未转换编码的情况下去掉 UTF-16 BOM,否则后半段会变成乱码。
不换行空格 U+00A0 看起来和普通空格一样,却是不同码点。表格和网页复制常会带上它。相等比较会失败,分割会留下残渣,只认识 U+0020 的 trim 也去不掉它。除非需要不换行行为(例如法文标点),否则把它替换成普通空格。
Word 和许多 CMS 会把直引号变成弯引号,把连字符变成 en/em 破折号。这些字符在散文里没问题,但在稍后要和 ASCII 引号比较的 CSV 字段里是致命的。目标是机器解析时,归一成直引号和连字符;目标是发表文章时,保留智能标点。
Windows 的 CRLF、Unix 的 LF,以及偶尔来自老 Mac 的裸 CR,在多次导出后可能出现在同一数据集。多数现代解析器都能接受,但有些分割器和校验和不行。Unix 侧流水线归一成 LF,Windows 规范要求时用 CRLF。同时确保最后一行以换行结束;有些导入器会忽略没有换行的末行。
文本字段里的空字节 U+0000 几乎总是损坏或误粘贴了二进制。删掉空字节。除制表符和换行外,U+0020 以下的其他控制字符在表格数据里很少是故意的。按流水线决定是删除还是让该行失败;静默删除可能掩盖上游导出已经坏了。
如果 CSV 字段包含分隔符且未被引号包裹,列会错位,后面所有字段都会错。清理文本无法凭空发明不存在的引号,但可以报告字段数与表头不一致的行。修复导出时的引号规则,或在字段经常含逗号、引号、换行时改用比 CSV 更稳的格式。
先检测编码,包括任何 BOM。解码到 Unicode。若目标需要 ASCII 标点,替换不换行空格并归一引号。归一换行。校验字段数。然后才载入数据库或表格。导入失败后再清理,通常比导入前清理更慢,因为错误信息往往指错列。
就地静默改写文件的清理器会让失败难以重放。更好的步骤是写出清理副本和简短替换日志:去掉 BOM、归一了 N 个不换行空格、转换了换行、M 行字段数不匹配。导入仍然失败时,日志能说明清理是否已跑、动过什么。于是神秘的解析错误变成可以重跑的清单项。
(中文扩写)If half the rows have the wrong number of columns, the export is broken and no amount of character cleanup will restore meaning. Fix quoting and delimiters at the source. If values contain embedded line breaks that are semantically part of the field, stripping newlines will destroy them. Cleaning is for invisible encoding and punctuation problems, not for repairing a schema mismatch or a truncated download.
常见问题
常常是 UTF-8 BOM 粘在了第一个表头单元格上。去掉 BOM 再导入。
目标是解析器或代码时去掉;目标是给人读的文章时保留。
看起来一样,对多数程序不一样。它是不同字符,会弄坏只认普通空格的 trim 和 split。
以 Unix 为中心的流水线用 LF;Windows 消费方要求时用 CRLF。选一种并归一,不要混用。