CSV 格式化工具(解析 / 转义 / 对齐 / 换分隔符)

按 RFC 4180 逐字符解析并重新序列化:只有字段含逗号、双引号或 CR/LF 才加引号,字段内部的双引号写成两个。默认示例是一张 4 行 3 列的小表,同时含「备注里有逗号」「备注里有成对双引号」「备注里有换行」三种脏数据,处理完再把结果喂回同一个解析器做一致性校验。分隔符可在逗号、分号、制表符、竖线之间切换,行尾可选 CRLF 或 LF,也能按列对齐预览。

当前方言为逗号:只有含逗号、双引号或 CR/LF 的字段会被加引号,其余字段保持裸写。
name,note,qty
张三,"含逗号, 的备注",3
李四,"他说 ""你好"", 然后离开",1
王五,"第一行
第二行",2

默认示例:一张含三种脏数据的 4 行 3 列表。改分隔符、引号策略、行尾、对齐开关或行数上限都会立刻重算,光标停在行数上限框里按回车同样触发一次。

使用方法

  1. 文本框里默认放着一张四行示例表:表头 name,note,qty,张三的备注含逗号,李四的备注有成对双引号,王五的备注里有真正的换行。按 Ctrl+Enter(Mac 用 Cmd+Enter)或点「格式化 CSV」触发。
  2. 「分隔符方言」默认逗号。德语区与法语区 Excel 的默认列表分隔符是分号,发出去前换成「分号 ;」,整行挤进一列的问题就消失;切制表符是 TSV,切竖线常见于日志管道。
  3. 「引号策略」默认 minimal,只有含界线字符的字段才加引号;选 all 后每个字段都加引号,老旧解析器读得更稳,代价是文件变大。
  4. 「行尾」默认 CRLF,即 RFC 4180 写明的那一对字符;换成 LF 更接近 Linux 脚本与 Git 仓库的习惯,复制与导出都按此落地。
  5. 「对齐预览」默认关闭。开启后按每列最宽值补齐空格,空格加在引号外面,并强制每个字段加引号——否则空白会被解析回数据表里。
  6. 「参与处理的行数上限」默认 50 行,允许 1 到 200,超出的行会被截掉并在蓝框说明。
  7. 输入为空、双引号没闭合、引号出现在字段中间、各行列数不一致、行数上限填成 0 或 300,都会给出针对该条的提示。
  8. 结果区下面是四张卡片:行数、每行列数、需加引号的字段数、二次解析是否还原;再下面是转义判定表,把二十个典型取值按当前方言逐条判一遍。

这个 CSV 格式化工具能解决什么

第一类是「备注字段里的逗号」。张三,"含逗号, 的备注",3 按逗号朴素切开会得到四段,备注里的逗号被当成列界线。RFC 4180 的做法是给整个字段包一层双引号:引号状态内逗号只是普通字符,只有引号外的逗号才算界线。

第二类是「字段里本来就有双引号」。写法是把一个引号写成两个:李四,"他说 ""你好"", 然后离开",1。只写一个会让解析器认为字段在此闭合,后面紧跟的逗号升格为界线,一个字段被劈成两列。CSV 的转义是引号翻倍,不是像 JSON 那样加反斜杠。

第三类是「一个字段跨了两行」。收货地址、客户备注里常有换行,只要被双引号包住,换行就属于字段内容而不是记录边界。示例第四行解析完仍是 4 条记录。

第四类是「双方软件认的分隔符不一样」。德语区与法语区 Excel 把分号当列表分隔符、把逗号当小数点,逗号分隔的文件发过去会整行挤成一列;换到分号方言后 张三;含逗号, 的备注;3 里的逗号不再是界线,连引号都省了。

还有一层保险:结果会被重新喂回同一个解析器逐字段比对,完全一致才算通过。这能挡住「看着排整齐了、数据其实已被改掉」,比如把补齐的空格塞进引号内部。

解析原理与字符规则

RFC 4180 只规定三件事:字段含逗号、双引号或 CR/LF 时才必须用双引号包围;字段内部的双引号写成连续两个;记录之间用 CRLF 分隔。它没有字符集规定,也没有类型推断——2026/01/01、007、1e5 在这里都只是字符串。

本页的解析器是逐字符状态机,而不是「先换行切断、再按分隔符切列」。它只有两个状态:引号内与引号外。引号外的分隔符结束当前字段、CR 或 LF 结束当前记录;引号内的字符一律照抄,连续两个双引号折叠成一个。

为什么不能用切分与替换来写。跨行字段按行切断会被劈成两行,第二行凭空多出半个引号;只有状态机能保持引号内的换行为普通字符。同理,先把 "" 全局替换成 " 再切分,会把藏在引号里的界线字符放出来。

换方言为什么能少加引号。引号的作用只有一个:保护字段里的界线字符。切到分号后逗号失去界线含义,含逗号, 的备注 退化成普通文本;反过来含分号的字段就要被加引号。所以换方言后,哪些字段需要引号是会挪位置的。

对齐预览为什么必须配引号。把 ab 补齐到宽度 4,空格写在引号内得到 "ab ",解析回来是 ab ,数据被改;写在引号外得到 "ab",解析回来仍是 ab。本页开启对齐时强制加引号,正是为了把空白挡在引号外。

为什么需要二次解析。一次正确的往返应满足「再解析一次得到同一张表」。本页把结果重新喂给同一个状态机,逐一比较行列数与每个字段,完全一致才显示「OK 完全一致」。

再序列化只有三个变量:分隔符 d 决定哪个字符是界线,策略 qt 决定按需加还是全部加,行尾 eol 决定用 \r\n 还是 \n。三者都与数据内容无关,只改变这份数据的方言。

完整示例

默认示例 4 行 3 列,逐字段解析:第 1 行 name、note、qty;第 2 行 张三、含逗号, 的备注、3;第 3 行 李四、他说 "你好", 然后离开、1;第 4 行 王五、第一行\n第二行、2。四行都是 3 个字段。

用 minimal、逗号方言、CRLF 序列化:首行裸写成 name,note,qty;第二行备注因含逗号被加引号;第三行内部引号翻倍后写成 李四,"他说 ""你好"", 然后离开",1;第四行保留字段内部那个真正的换行,物理上占两行、逻辑上仍是一条记录。

切到 all 后,首行变成 "name","note","qty",第三行变成 "李四","他说 ""你好"", 然后离开","1"——内部引号翻倍这条规则在两种策略下完全一样。这段结果再解析一次,仍得到 4 行 3 列且每个字段一致。

切到分号方言后同一条记录变成 张三;含逗号, 的备注;3,一个引号都不需要;制表符得到 张三\t含逗号, 的备注\t3,竖线得到 张三|含逗号, 的备注|3,同理都不需要引号。

分隔符方言与引号对照表

同一条记录在四种方言下的输出,注意「是否还需要引号」这一列会随方言变化。

方言界线字符这一行的输出是否还需要引号典型场景
逗号方言,张三,"含逗号, 的备注",3需要(字段含逗号)英语区 Excel
分号方言;张三;含逗号, 的备注;3不需要德语区、法语区 Excel
制表符方言\t张三\t含逗号, 的备注\t3不需要TSV、命令行管道
竖线方言|张三|含逗号, 的备注|3不需要日志、数据仓库

哪些字符会触发加引号,以及相关的保留策略。

字段情形写法minimal 是否加引号说明
含当前分隔符含逗号, 的备注加不加会被当成多一列
含双引号他说 ""你好""加,且内部引号翻倍翻倍只发生在字段内部这一个层级
含 LF 或 CR第一行\n第二行加换行属于字段内容,不结束记录
前后有空格" 张三 "按 RFC 不必加要保留前后空格就手动加引号
纯文本或数字abc / 123不加类型由读取方推断,本页按字符串
空字段(空)不加两个连续分隔符之间视为空字符串

对齐补齐位置的正误对比,这是最容易改坏数据的一处。

补齐位置写法再次解析得到结论
引号内"ab "ab 多了两个空格,数据被改,错
引号外 "ab"ab还原成原值,对

结果边界与保留策略

常见问题

Excel 打开后中文全是乱码,是文件坏了吗?

多半是编码问题。本页导出的 CSV 已写入 UTF-8 BOM,直接双击打开应当正常;若在编辑器里另存时选了 ANSI 或系统本地编码,才会出现乱码。

为什么备注里的换行不会被当成新记录?

因为它被包在双引号里。RFC 4180 规定只有处在引号之外的 CR/LF 才结束一条记录,引号内部的换行属于字段内容。示例第四行因此是 1 条记录,不是 2 条。

该用 CRLF 还是 LF?

RFC 4180 规定用 CRLF,Windows 上的 Excel 也更习惯它;LF 更接近 Linux 脚本与 Git 仓库里样例文件的做法。文件要在 Windows 与 macOS 之间来回传,保留默认 CRLF 更省事。

对方打开我的文件只有一列,怎么回事?

对方软件认的分隔符与你导出的不一致。德语区、法语区 Excel 的默认列表分隔符是分号,于是整行被识别成一个字段;把方言切成「分号 ;」重新导出即可。

前导零编号 007 会被吃掉吗?

本页不会。所有字段按字符串处理,不做数字推断,007 保持原样。吃掉前导零的是下游软件的类型推断,想保住它需要在读取方把该列设为文本。

开启对齐预览后为什么每个字段都加上了引号?

因为补齐空格写在引号内会被解析回数据表里把内容改掉。本页开启对齐时强制给每个字段加引号,再把空白补在引号外面,保证再解析一次仍得到原值。

这个工具免费吗?

免费,无需注册即可使用。

输入的数据安全吗?

安全。解析与重新序列化都在当前浏览器本地完成,表格内容不会上传到服务器。

相关工具