使用方法
- 打开页面就有一组完整结果:输入框已经填入一份三行三列的示例 TSV,结果区已经给出对应的 CSV(含逗号与引号的单元格已被正确转义),不需要先填任何东西。
- 想转换自己的数据,就把输入框里的示例整段替换成你的 TSV;列与列之间必须是真正的制表符(Tab),而不是多个空格。
- 输入框按 Ctrl 或 Cmd 加回车会立即转换;也可以每敲一个字就实时看到结果。结果区第一行是转换后的 CSV 文本,可直接复制粘贴进表格软件。
- 如果需要在 Excel 里直接双击打开,保持「包含 UTF-8 BOM」勾选,再点「导出 CSV」下载带标记的文件;只想复制文本就点「复制结果」。
- 结果区下面是「转义场景对照表」,列出 14 种典型单元格场景与其转换后的 CSV,方便你核对转义规则是否理解正确。
- 本页不联网、不写本地存储,刷新即回到默认示例;你输入的文本只在本机内存里算完即弃。
这个TSV转CSV转换器能解决什么
这个TSV转CSV转换器帮你把数据库导出、网页复制、日志抓取里常见的 Tab 分隔文本,变成几乎所有软件都能吃的逗号分隔 CSV。它最实用的地方是「正确转义」:当某个单元格里本身就有逗号或双引号时,如果直接拿逗号去拼,下游软件会把一格拆成两格,或者把引号当成字段边界,数据就乱了。
第二类场景是跨工具搬运表格。很多系统导出的中间格式是 TSV,但人最习惯用 Excel 打开 CSV,二者只差一个分隔符和一套转义约定。本页把这套约定做对,省得你手动去找替换、还容易漏掉藏在数据里的特殊字符。
第三类场景是处理"脏数据"。真实数据里经常混着引号、逗号甚至换行,本页按 RFC 4180 的规则统一处理——含特殊字符的整格加引号、内部引号双写——让你不必为每种意外单独写清理脚本。
必须写清的边界:标准 TSV 本身不支持"单元格内换行",输入里出现的换行会被当作"换一行",而不是一个跨行的单元格;真正需要跨行单元格时,CSV 侧也要靠引号包住整格,本页对此只做尽力而为的拆分。
分隔符判定与转义的原理
转换分三步。第一步按换行把文本切成行(兼容 \r\n 与 \n);第二步每行再按制表符切成单元格;第三步把每个单元格判断是否需要加引号:只要单元格里出现逗号、双引号、换行或回车中任意一个,就整格用双引号包起来,并且把单元格内部的每个双引号写成两个双引号(双写)。
为什么引号要双写?因为 CSV 用双引号当字段边界,如果数据里本来就有引号,读取方无法区分"这是边界"还是"这是数据"。约定成"两个引号表示一个数据引号"后,解析方就能无歧义地还原。例如单元格内容是 "上海,浦东"(含引号与逗号),包起来并双写后变成 """上海,浦东""",读取时首尾各吃掉一个边界引号,内部的 "" 还原成一个数据引号。
关于 BOM:CSV 本质是文本,Excel 在中文 Windows 下常按本地编码打开,导致中文乱码。在文件最前面写入 UTF-8 字节序标记(EF BB BF),Excel 就能认出这是 UTF-8。本页的"导出 CSV"会在勾选时带上它,而页面上的结果文本与"复制结果"不带,以便你能看清纯内容。
| 变量 | 含义 | 取值 | 影响 |
|---|---|---|---|
| tsv | 原始 TSV 文本 | 含 \t 与换行的纯文本 | 转换的唯一输入 |
| cell | 单个单元格 | 被 \t 切出的片段 | 决定是否加引号与双写 |
| needQuote | 是否需引号 | 含 , " \n \r 之一为真 | 为真才整格加引号并双写 |
| bom | BOM 开关 | 勾选 / 不勾选 | 只影响导出文件,不影响页面文本 |
完整示例
默认示例的 TSV 共三行:第一行是表头 姓名、年龄、城市;第二行 张三、28、北京,全是普通字符,直接拼接成 张三,28,北京;第三行 李,四 含逗号、而 "上海,浦东" 这个单元格本身带着一对引号且含逗号,于是对整格加引号并双写内部引号,变成 """上海,浦东"""。结果区里那一整段就是:
姓名,年龄,城市 张三,28,北京 "李,四",32,"""上海,浦东"""
如果把输入换成只有一行的 李,四 32 "上海,浦东",输出就是 "李,四",32,"""上海,浦东""",和对照表里"逗号加引号"那一行一致。两个结果都是当场算出来的,不是写死的。
转义场景对照表
下表共 14 行:覆盖普通文本、含逗号、含引号、空字段、中文、英文、混合等典型场景。每行的 CSV 结果都由页面里的同一套转义函数现场算出,和你在上方输入框里得到的结果用的是同一套逻辑;默认显示 12 行,点「加载更多」看余下 2 行。
| 场景 | 说明 | CSV 结果 |
|---|---|---|
| 普通文本 | 不含逗号与引号,直接拼接 | 姓名,年龄,城市 |
| 含逗号 | 单元格出现英文逗号须加引号 | "李,四",32 |
| 含双引号 | 内部引号须双写并整格加引号 | """He said hi""",x |
| 逗号加引号 | 同时含逗号与引号 | """上海,浦东""",ok |
| 全数字 | 纯数字按原样输出 | 28,32,19 |
| 空单元格 | 连续分隔符产生空字段 | a,,c |
| 中文无特殊 | 中文标点不触发转义 | 张三,北京,28 |
| 单引号 | 单引号不是 CSV 特殊字符 | a'b,c |
| 分号 | 分号也不触发转义 | a;b,c |
| 前后空格 | 字段内含空格保留但不加引号 | x ,y |
| 仅逗号英文 | 英文单词含逗号 | "Hello,World",1 |
| 引号在开头 | 引号位于单元格首位 | """lead""",x |
| 两列含逗号 | 两个单元格都含逗号 | "a,b","c,d" |
| 混合长字段 | 含逗号引号与中文 | """你好"",世界",x |
横向读这张表能得出一条实用结论:判断要不要加引号,只看单元格里有没有 , " 换行 回车 这四类字符,和"是不是中文""有没有空格"都没关系——中文、空格、分号、单引号都不会触发转义。
结果边界与错误提示
- 输入框为空时,会自动填回默认示例并立即转换,不会留下空白结果。
- 列与列之间如果用的是空格而不是真正的 Tab,会被当成同一格,提示写明:『分隔符看起来不是制表符:请用 Tab 而不是空格分隔列,否则会被当作一格』。
- 单元格里的双引号一定会被双写,不会原样保留,避免出现『"""』之外的歧义写法。
- 输入里的换行一律当作"换行"(新的一行),标准 TSV 不支持单元格内换行,需要跨行单元格请改用已带引号的 CSV 源。
- 「导出 CSV」是否带 BOM 由「包含 UTF-8 BOM」复选框决定,默认勾选;页面结果文本与「复制结果」始终不带 BOM。
- 结果文本中的行以换行连接(\n),导出的文件则以 \r\n 连接,符合 Excel 对 CSV 换行的要求。
- 本页不上传任何输入,也不写本地存储;导出的对照表 CSV 带字节序标记,复制结果为纯文本。
常见问题
为什么我的逗号没有被正确分开?
多半是列之间用了空格而不是制表符。CSV 以逗号为分隔,但若源头 TSV 其实是用空格对齐的,本页会把整行当一个单元格,逗号也就不会被当成分隔。请确认你的文本是用真正的 Tab 分隔,必要时先在编辑器里显示不可见字符。
双写引号到底怎么读?
读取方遇到两个连续引号,会还原成一个数据引号;最外层的一对引号是字段边界。所以 """上海,浦东""" 拆开是:边界引号 + 数据内容 "上海,浦东"(其中内部引号已双写还原)+ 边界引号,最终得到带引号与逗号的一个完整单元格。
一定要勾 BOM 吗?
不一定。BOM 只是帮 Excel 识别 UTF-8,避免中文乱码;如果你把结果粘进已经用 UTF-8 打开的编辑器或程序,不带 BOM 更干净。页面文本与复制结果都不带 BOM,只有「导出 CSV」在勾选时带。
单元格里有换行怎么办?
标准 TSV 不定义单元格内换行,本页会把换行当作"下一行",而不是跨行单元格。若你确实要一个跨多行的单元格,应改用 CSV 源并用引号把整格包住,解析软件才会把它当作一格内的换行。
单引号和分号要转义吗?
不要。CSV 只对逗号、双引号、换行、回车敏感,单引号、分号、空格、中文都不触发转义,会原样保留。这也是对照表里"单引号""分号"两行没有额外引号的原因。
转换大文件会卡吗?
转换是纯字符串处理,在浏览器里同步完成。几千行通常瞬间结束;几十万行会占用较多内存与时间,建议分批处理,本页没有做分块流式转换。
我的文本会被上传吗?
不会。整个转换过程都跑在你的浏览器本地,文本只存在于本机内存,页面既不发请求也不写本地存储,刷新后输入框回到默认示例。
导出的对照表 CSV 带字节序标记吗?
带。对照表 CSV 导出时写入 UTF-8 字节序标记,Excel 双击不乱码;「复制对照表」是制表符分隔文本,粘进表格软件会自动分列,两者内容一致。
相关工具
- CSV转JSON转换器:把 CSV 表格反向转换成 JSON 数组。
- JSON校验工具:校验并格式化 JSON 文本。
- HTML格式化:缩进与整理 HTML 代码结构。
- 字数统计工具:统计文本的字数与字符数。
- Base64编码:把文本或二进制做 Base64 编码与解码。