经营数据导出成CSV后,用文本编辑器打开,看到的行数比业务记录数多,是否说明导出重复了?不一定。备注字段本身可能带有换行;若只按屏幕上的换行计数,就可能把一条记录的内部内容当成下一条记录。

2005年10月的RFC 4180记录了一种常见CSV格式,并登记text/csv媒体类型。它的类别是Informational,开头明确说并非互联网标准。[1] 下文据其格式说明解释换行,不把它说成所有导出工具都必须完全一致的强制规范。

该文第2节一方面以CRLF分隔记录,另一方面说明,包含换行、逗号或双引号的字段应放在双引号内。两句话需要一起读:双引号内部的换行属于字段值,不能仅因出现CRLF,就立即把记录截断。文中的语法也允许被引号包围的字段含有CR或LF。

例如,本文自拟一条订单记录,编号为A,备注为“上午沟通”后换行再写“下午校对”。按上述格式表达时,整段备注由一对双引号包围。它在文本中占了两行,但仍可以属于同一条订单记录。这里没有实际导出企业数据,也没有声称任何现有文件已通过解析。

双引号本身还会带来一个细节:若字段已经由双引号包围,值内出现的双引号用连续两个双引号表示。[1] 因此,检查引号边界不能简单地把遇到的每个双引号都看作独立的字段结束。逗号同样可能位于字段内部,单纯按逗号切分也会遗漏这种条件。

报表交接可以分别写明文件采用的格式、是否有表头,以及业务记录数由什么解析结果得到。RFC 4180把表头列为可选项,所以即使不存在字段内换行,文本行数是否含表头也要说明。本文没有给生产文件执行清洗或修复;先分清显示行与记录,再核对实际导出约定,才能判断差异究竟来自哪里。

信息来源

本文基于上述公开资料整理,未使用来源页面的图片、视频或嵌入媒体。