1. CSV 文件基础认知

做配方数据导入,第一个绕不开的就是 CSV。说实话,很多人觉得 CSV 太简单了——不就是个逗号分隔的文本文件吗?但我在项目里见过太多因为 CSV 编码、空行、引号问题导致导入失败的情况。今天咱们就把这些坑一个一个填平。

一句话总结:CSV 是纯文本格式,不是 Excel 专属,也不是数据库。它只存数据,不存格式。

1.1 什么是 CSV?

CSV 全称 Comma-Separated Values,逗号分隔值。说白了,就是用逗号把数据隔开,一行一条记录。我最早接触 CSV 是在十年前做 ERP 数据迁移的时候,那时候供应商给的数据全是 CSV,打开一看,嗯,就是个文本文件。

一个标准的 CSV 文件长这样:

配方编号,配方名称,物料编码,用量,单位
R001,基础面浆,ML-001,500,g
R002,糖水溶液,ML-002,300,ml
R003,乳化液,ML-003,200,ml

你看,第一行是表头,后面是数据行。每个字段用逗号隔开。就这么简单。

但简单归简单,有几个关键点你得记住:

  • 纯文本——不存字体、颜色、合并单元格
  • 无格式——不存公式、宏、图表
  • 跨平台——Windows、Mac、Linux 都能打开
  • 通用性——几乎所有数据处理工具都支持

1.2 CSV 与 Excel 的区别

很多人把 CSV 和 Excel 混为一谈,我刚开始也犯过这个错。有一次客户说「我把 Excel 发给你了」,结果打开一看是 .csv 文件。嗯,这俩其实完全不是一回事。

对比维度 CSV Excel (.xlsx)
本质 纯文本文件 二进制文件
格式存储 不存储 存储字体、颜色、边框
公式 不支持 支持
多工作表 不支持(只有1个表) 支持
文件大小 小(纯文本) 大(含格式信息)
打开方式 记事本、编辑器、Excel 均可 需 Excel 或兼容软件
数据交换 极佳(通用格式) 较差(专有格式)

我个人习惯:数据交换用 CSV,数据分析用 Excel。CSV 是「数据搬运工」,Excel 是「数据加工厂」。你想想看,如果每次导入配方数据都要打开 Excel 另存为,那批量导入的效率就全毁了。

1.3 CSV 的编码问题:UTF-8 vs GBK

这是我在项目中遇到最多的问题,没有之一。编码不对,数据直接乱码,配方名称变成一堆「锟斤拷」。

为什么会这样?因为 CSV 是纯文本,它必须用一种编码方式来存储字符。中文环境下,最常见的两种编码是:

  • UTF-8:国际通用编码,支持所有语言,推荐使用
  • GBK:中文专用编码,Windows 简体中文版默认
注意:用 Excel 打开 CSV 时,它默认用 GBK 编码。如果你的 CSV 是 UTF-8 编码,Excel 打开会乱码。反过来,如果你的系统是 UTF-8 环境,GBK 编码的 CSV 也会乱码。

我建议:统一使用 UTF-8 编码。原因很简单——你的配方数据可能包含英文、数字、特殊符号,UTF-8 都能兼容。而且现在的 Web 系统、数据库、API 接口,基本都认 UTF-8。

怎么确认编码?用记事本打开 CSV,点「另存为」,看右下角的编码选项:

记事本另存为界面:
编码下拉框:ANSI(GBK)、UTF-8、UTF-16

推荐选择:UTF-8

如果你用 VS Code 或 Sublime Text,右下角会直接显示当前编码,点击就能切换。

我的经验:批量导入前,先写一个编码检测脚本。如果检测到 GBK,自动转 UTF-8。这一步能避免 80% 的导入失败问题。

1.4 CSV 的常见坑点

这部分是我最想跟你分享的。CSV 看起来简单,但坑是真的多。我曾经因为一个空行,导致整个批次的配方数据导入错位,排查了整整一下午。

坑点一:空行

CSV 文件末尾或中间的空行,会被某些解析器当成一条空记录。比如:

配方编号,配方名称,用量
R001,基础面浆,500
                          ← 空行
R002,糖水溶液,300

有些系统读到空行就报错,有些系统会插入一条空数据。我的建议:导入前用脚本清理空行。

# Python 示例:清理 CSV 空行
with open('配方数据.csv', 'r', encoding='utf-8') as f:
    lines = [line for line in f if line.strip()]
# 现在 lines 里没有空行了

坑点二:引号转义

如果数据里包含逗号、换行符、引号本身,CSV 会用双引号包裹。比如:

配方编号,配方名称,备注
R001,基础面浆,"含"食品级"添加剂"

这里就有问题——数据里的双引号没有转义。正确的写法是:

配方编号,配方名称,备注
R001,基础面浆,"含""食品级""添加剂"

规则很简单:数据中的双引号,用两个双引号转义。整个字段再用一对双引号包裹。

我曾经踩过的坑:有一次供应商给的 CSV 里,备注字段有换行符,但没加引号包裹。结果导入时,一条记录被拆成了两行,后面的字段全部错位。从那以后,我写导入脚本都会加一个「字段数校验」——如果某行的字段数不等于表头,直接报错并打印行号。

坑点三:逗号在数据中

配方用量里如果有逗号,比如「1,500g」,解析器会把它当成两个字段。解决办法:用双引号包裹。

配方编号,配方名称,用量
R001,基础面浆,"1,500"

坑点四:BOM 头

UTF-8 编码的 CSV 有时会带 BOM(Byte Order Mark),就是文件开头的三个字节 EF BB BF。Excel 保存 UTF-8 CSV 时默认加 BOM,但有些系统不认 BOM,会把它当成数据的一部分。

我的做法:统一用 UTF-8 without BOM。VS Code 保存时选「UTF-8 with BOM」或「UTF-8」就能控制。

1.5 知识结构总览

下面这张图,把 CSV 的核心知识点串起来了。你可以把它当成一个快速参考。

CSV 文件核心知识体系 CSV 文件 什么是 CSV CSV vs Excel 编码问题 常见坑点 纯文本格式 逗号分隔 无格式 跨平台 UTF-8 GBK 空行 引号转义 逗号冲突 核心原则:数据交换用 CSV,数据分析用 Excel 编码统一用 UTF-8,导入前必做空行和引号校验

1.6 本章小结

CSV 是配方数据批量导入的基石。你不需要成为 CSV 专家,但下面这几点一定要记住:

  • CSV 是纯文本,不是 Excel,别指望它存格式
  • 编码用 UTF-8,别用 GBK,除非你确定上下游都支持
  • 空行和引号是最大的坑,导入前必须清理和校验
  • 数据中的逗号要用双引号包裹,引号本身要转义