利用 AI 掌握 CSV 文件:结构、使用场景与核心优势

几乎您使用的每一个系统都可以导出 CSV 文件。这就是它得以存续的原因,也是它会以意想不到的方式出错的原因。
本文将介绍该格式的实际规范、不同实现方式的分歧所在,以及它真正适合用于哪些工作。
关于该格式的一切都源自 RFC 4180,这是 2005 年 10 月发布的一份注册了 text/csv 媒体类型的文档。相同的文本也镜像在 IETF datatracker 上。
CSV 文件究竟是什么
CSV 文件是排列成记录和字段的纯文本。它底层没有工作簿、没有格式化层,也没有公式引擎。
RFC 4180 对其自身的地位坦诚得异乎寻常。它指出“目前不存在正式的规范,这导致对 CSV 文件存在各种各样的解释”。
因此,该文档描述的是惯例而非法律。用它自己的话来说,它阐明了“大多数实现似乎都在遵循的格式”。
这简单的一句话解释了使用 CSV 时遇到的大多数痛苦。两个工具可能都完全合理,但对同一个文件却有着不同的解读。
规范中的七条规则
RFC 4180 列出了七条规则。它们足够简短,值得您牢记于心。
- “每条记录位于单独的一行,由换行符 (CRLF) 分隔。”
- “文件中的最后一条记录末尾可以有换行符,也可以没有。”
- 第一行可以有一个可选的标题行,其字段数量与记录的字段数量相同。
- 字段由逗号分隔,并且“整个文件中每行应包含相同数量的字段”。
- 字段可以包含在双引号中,也可以不包含。
- “包含换行符 (CRLF)、双引号和逗号的字段应包含在双引号中。”
- 被引号包围的字段内部的双引号“必须通过在其前面加上另一个双引号来进行转义”。
这些规则中的两个条款带来的麻烦比其他所有条款加起来还要多。
空格也是数据。规则 4 指出“空格被视为字段的一部分,不应被忽略”。一个多余的空格就是一个不同的值。
末尾不能有逗号。同一条规则还指出“记录中的最后一个字段后面不能跟逗号”。末尾的逗号意味着多出一个空字段。
为什么两个有效的 CSV 文件仍会产生分歧
规则 5 包含了一个预示了大多数现实世界故障的承认。RFC 4180 指出“某些程序(例如 Microsoft Excel)根本不使用双引号”。
一旦引号变成可选的,规则 7 中的转义规则也就变成了有条件的。一个工具写入的文件可能会被另一个工具以不同的方式读取,而两者都没有错。
正式的语法表明了安全路径是多么狭窄。该规范的字段定义仅允许转义或非转义形式,其中转义形式将逗号、回车符和换行符包裹在双引号内。
在实际应用中,这就是一个带有逗号的客户姓名会将一行数据变成两行的原因。
这种失败是悄无声息的,这也正是其代价高昂的原因。没有任何报错。您只是得到了一个行数超出预期的文件,而且多出来的行看起来还挺合理的。
导致大多数故障的两个参数
RFC 4180 中的 MIME 注册根本没有列出任何必需的参数。它只列出了两个可选参数:charset 和 header。
两者都是可选的,而且在导入出错时,两者通常都是“罪魁祸首”。
Charset(字符集)。注册信息指出“CSV 的常用用法是 US-ASCII”,同时也允许其他字符集。文件内部没有任何内容声明使用了哪种字符集,这就是为什么带重音符号的名字和货币符号导入后会变成乱码。
Header(标题)。规则 3 使标题行成为可选,注册信息表示其存在“应通过可选的 header 参数来指示”。一个光秃秃的文件不会告诉你第一行是数据还是标签。
第三个问题根本不在规范中,因为规范对此只字未提:没有数据类型。在下游的某些环节做出其他猜测之前,每个字段都是文本。
在哪些场景下 CSV 文件是正确的选择
该格式在便携性上胜出,这可不是一件小事。
在毫无关联的系统之间迁移数据。任何两个能够读取文本的工具都可以交换 CSV 文件。
归档十年后仍必须打开的文件。没有会过时的专用阅读器。
流式传输和追加。因为每条记录都是一行,所以程序可以写入行而无需重写整个文件。
差异对比(Diffing)和版本控制。基于行的文本适用于您已用于代码的工具。
在哪些场景下 CSV 文件会让你付出代价
同样的简单性也去掉了您可能依赖的功能。
| 您失去了什么 | 为什么这很重要 |
|---|---|
| 数据类型 | 前导零、长 ID 和日期在导入时会被重新解释 |
| 多个工作表 | 一个文件就是一张表,因此关联关系必须存在于其他地方 |
| 公式和格式 | 导出后只有计算出的值能保留下来 |
| 声明的编码 | 文件内部没有任何内容说明其字符集 |
| 声明的分隔符 | 分号分隔的导出很常见,且仍被称为 CSV |
这些都不是 Bug。它们是使用不携带元数据的格式所付出的代价。任何您需要保留的内容都必须在文件本身之外进行记录。
核心优势总结
如果您需要一句话的总结,那就是它了。
CSV 文件是移动表格数据最便携、最持久且最适合流式传输的方式。它通过除了数值之外不携带任何其他内容来实现这一点。
当接收系统未知或在遥远的未来时,这种权衡是值得的。但如果类型、关联关系或格式必须在传输过程中保留下来,这就是一个糟糕的权衡。
它的制表符分隔(TSV)表亲则是用一个问题换取了另一个问题。我们关于掌握 TSV 文件的配套文章介绍了这种交换在哪些方面有所帮助。
使用 AI 处理 CSV 文件
“我拿到了文件”与“我得到了答案”之间的差距是大部分时间消耗的地方。现在,这一差距在很大程度上可以实现自动化。
Powerdrill Bloom 可以直接接收文件。其免费计划支持上传 Excel、CSV、PDF 和文档,并能生成洞察、图表和摘要。
三个功能页面涵盖了常见的工作。 CSV AI 助手处理关于单个文件的问题。CSV AI 工具涵盖了更广泛的工具集,而合并 CSV 文件则可以合并分别导出的文件。TSV 分析页面涵盖了制表符分隔的变体。
用自然语言描述任务可以避免通常的弯路。您不需要编写解析器或猜测编码,只需指明您需要的输出即可。
方案可在定价页面查看,免费档已足够在真实的导出文件上进行测试。如需尝试,请从 Powerdrill Bloom 开始。
常见问题解答
是否存在官方的 CSV 标准?
RFC 4180 注册了 text/csv 媒体类型并记录了常见做法。它直截了当地指出不存在正式的规范,因此请将其视为惯例,而非严格的标准。
为什么我的前导零消失了?
该格式不携带数据类型,因此下游工具会判定像 00123 这样的值是一个数字。用引号将其包围并不总能阻止这种猜测。
我该如何处理值内部的逗号?
根据规则 6,将该字段用双引号包围。如果该值还包含双引号,则根据规则 7,通过将其双写来进行转义。
分号分隔的文件仍是 CSV 吗?
它们被广泛生成并被广泛称为 CSV,但规范描述的是逗号。在导入之前请检查分隔符,而不是凭空假设。在文本编辑器中打开前两行只需几秒钟,就能解决这个问题。
CSV 还是 TSV:我应该导出哪种?
根据您的数据进行选择。在文本值中,制表符比逗号更罕见,这减少了使用引号的需要。但当文件通过编辑器复制时,制表符也更容易丢失。