表格是怎么被读出来的,以及直觉式解析会在哪里出错
读取器把文本看成由分隔符隔开的字段,以及由换行分隔的记录,字段可以用双引号包起来。在引号内部,两个连续的双引号表示一个引号,分隔符只是一个普通字符,换行结束的是字段而不是记录——所以一条两行的备注仍然是一个单元格,而先按换行切分的读法会把整个文件撕成两半。引号也只能包住整个字段,不能只包住字段的一部分;字段末尾的空格属于值本身,规范并不会替你裁掉。
分隔符之所以是一个设置项,是因为它并不总是逗号:使用小数逗号的国家习惯用分号,Excel 复制出来的是制表符分隔的文本。自动检测会找出在前几行里出现次数都相同的那个字符,这是真实表格留下的特征,而不是巧合;结果面板会明确说明最终用了哪一个分隔符。
在数据到达之前还有两件事要处理。Excel 在“CSV UTF-8”导出文件开头写入的字节顺序标记会被移除,否则它会悄悄成为第一个列名的一部分,之后按列名查找的代码全都找不到它。另外,以等号、加号、减号或 @ 开头的单元格,可能被表格软件当作公式执行,也就是 CSV 注入,所以这类单元格会保持为纯文本,并单独计数上报。行尾的 CRLF 与 LF、以及未闭合的引号,也都在读取阶段处理:前者按规范接受,后者不会让整页解析悄悄吞掉后面的内容。