CSV空值行需分步处理:先用^s*$删纯空行,再用^[ ]*(["",,][ ]*)*$匹配含逗号、引号、空格的空值行,并注意BOM、全角符号及多行字段等陷阱。

CSV空值行不是“空行”,别直接用 ^s*$
CSV 文件里的“空值行”通常指整行都是 ,、,,、"","" 或带空白的 , , ,而不是视觉上什么都没有的空行。直接套用删空行的 ^s*$ 会漏掉绝大多数真实空值行,甚至误删含空格的正常数据行。
真正要匹配的是:逗号分隔、字段全为空(可含引号、空格、制表符)的行。典型例子:
,,,"","","", ,"",,""
这些必须用更精确的模式,比如:^[s""]*(?:[s""]*,[s""]*)*[s""]*$ ——但它太重,实际中不推荐手写。更稳的做法是分两步。
先删纯空行,再用 CSV-aware 模式筛空值行
Sublime 本身不解析 CSV 结构,但可以靠正则逼近。关键不是一步到位,而是分层过滤:
- 第一步:用
^s*$清掉真正空的行(文件里夹着的换行空隙),避免干扰后续匹配 - 第二步:用
^((?:"[^"]*"|[^,]*),)*((?:"[^"]*"|[^,]*))$这类模式太复杂且易错,换成更务实的:^[ ]*([",][ ]*)*$——它能抓到「整行只由逗号、双引号、空格、制表符组成」的行,覆盖上面所有典型空值行 - 第三步:手动验证前几行和末尾几行,尤其注意最后一行是否以换行符结尾——如果没换行符,
^和$可能锚定失效,导致漏匹配
容易被忽略的 CSV 特殊字符陷阱
真实 CSV 数据常混入不可见字符,导致正则看似匹配却漏行:
Miller (mlr) 是一个命令行工具,用于查询、整形和重新格式化名称索引数据,如 CSV、TSV、JSON 和 JSON Lines。它将 awk、sed、cut、join 和 sort 的功能整合到一个专为结构化数据处理而构建的单一工具中。
- Excel 导出的 CSV 常含 BOM(
ufeff),会卡在行首,让^失效;解决办法:先执行^ufeff替换为空,或改用^[\ufeff\s""]*(?:[\ufeff\s""]*,[\ufeff\s""]*)*[\ufeff\s""]*$ - 字段里有换行符(
"field with break")?Sublime 正则默认不跨行,这种行根本不会被当“空值行”处理——这是好事,说明你没误删合法多行字段 - 全角逗号(,)、中文引号(“”)?
,和"不匹配它们,必须显式加进正则,如:[,,]、["“”]
建议开 View → Show White Space,再按 Ctrl+Shift+P 输入 toggle_whitespace,把隐藏字符显形后再调试正则。
批量处理多个 CSV 文件时,别信 “Replace in Files”
Sublime 的 Find in Files 对 CSV 空值行批量替换极不可靠:
- 它不保证每行独立匹配,
^/$在多文件上下文中行为不稳定 - 替换后空行变成“零长度行”,界面仍显示为空,但文件体积不变,下次搜索还会命中
- BOM、编码不一致(如 GBK vs UTF-8)会导致部分文件完全不匹配
真要批量处理,请导出为纯 UTF-8 without BOM 格式,再逐个文件打开,用 Ctrl+H + ^s*$ + ^[ ]*([",,][ ]*)*$ 分步执行。或者,用 Python 脚本更稳妥:csv.reader 逐行判断 all(not cell.strip() for cell in row)。
最后检查一遍:删完后第一行是不是表头,最后一行有没有残留的 ,,, ——这种细节不手动翻到底,很容易在导入数据库时报“列数不匹配”。

















