piapia123
zh

CSV / TSV ↔ JSON 互转

格式化

所有处理都在浏览器本地完成,数据不上传服务器

输入
把文件拖到这里可直接载入
输出

把 CSV(或 TSV)转成 JSON 数组,或把 JSON 数组转回 CSV。分隔符默认自动识别 —— 判据不是「哪个符号出现得多」,而是哪一列的分隔符能让每行列数一致,所以「备注里有三个逗号」的分号表也会被正确认出来。 按规范处理引号和换行:字段里有分隔符、引号或换行时会自动加引号,内部引号翻倍。这一条最要紧 —— 少了它,字段里的换行会让输出的 CSV 在 Excel 里多出一行,从那里往下整张表全部错位,而文件本身是「打开成功」的。 数字只在无损时才转成数字。 CSV 里一切都是文本,一律按数字读会出两类错:`007` 变成 `7`(编号前导零丢了),长订单号超过 2^53 之后丢尾数。所以默认只在 `转成数字再转回字符串等于原样` 时才转换 —— `007`、`1.50`、`1e5` 都会保持字符串,`30`、`1.5` 会变成数字。要全部按文本读就把「数字怎么读」改成「全部按文本」。 还处理了两个从 Excel 里出来的坑:开头的 BOM 会让第一个键名带上一个看不见的字符(JSON 里打印出来是 `id`,但 `obj.id` 永远取不到),这里会剥掉;输出 CSV 时用 CRLF 换行,那是 Excel 唯一无条件认的一种。

功能

  • 三个方向:CSV → JSON、JSON → CSV、CSV → SQL(INSERT 语句,可选带 CREATE TABLE)
  • ⚠️ SQL 输出的表名与列名一律经白名单校验后才拼进语句 —— 非法的用双引号包起来,值里的单引号翻倍,不拼出注入口子
  • ⚠️ SQL 的类型推断只是猜测,并且与 CSV → JSON 用同一套判断(`true` 两边都是字符串)
  • 分隔符自动识别:逗号、分号、制表符、竖线;判据是「让每行列数一致」而不是「出现次数最多」
  • 引号、字段内换行、`""` 转义都按 RFC 4180 处理,输出的 CSV 在 Excel 里不会错位
  • 剥掉 Excel 导出的 BOM —— 否则第一个键名里会藏一个看不见的字符
  • 数字只在往返无损耗时转成数字:`007`、`1.50`、`1e5` 与超长 ID 都原样保留为字符串
  • 不带表头的表输出数组的数组,不编造 `"0"` `"1"` 这种看着像真字段的键名
  • 表头重名时补后缀(`id` / `id_2`),后面的列不会静默覆盖前面的
  • 数据行比表头长时多出来的列照常保留,比表头短时补空串
  • JSON → CSV 时列名取所有行键的并集,后面几行才出现的字段不会被整列丢掉
  • 嵌套的对象与数组压成 JSON 文本放在单元格里
  • 输出带语法着色,JSON 缩进可选 2 / 4 空格与制表符

使用方法

  1. 把 CSV / TSV 或 JSON 粘进输入框 —— 能解析成 JSON 的按 JSON 处理,其余按 CSV
  2. 方向、分隔符、有没有表头都可以手动指定
  3. 结果是实时的;如果分隔符认错了,手动选一个再看
  4. 点复制取走结果

常见问题

CSV → SQL 那个类型是猜的吗?
是,而且页面上也这么写。它只看这一列的值长什么样:全是整数就给 `INTEGER`(超过 32 位给 `BIGINT`)、全是小数给 `NUMERIC`、其余给 `TEXT`。它不知道那一列在数据库里该是什么 —— 一个存电话号码的列全是数字,但正确的类型是 `TEXT`(前导零、国家码里的 `+`)。所以把 `CREATE TABLE` 当成起点而不是结论,按你实际的语义改一遍再用。
生成的 SQL 拿去执行安全吗?
拼串的部分是按防注入写的:表名与列名先过白名单(只允许字母或下划线开头、后面字母数字下划线,且不是保留字),不合法的用双引号包起来;值里的单引号一律翻倍。这两处是必需的 —— CSV 的内容是你从别处拿来的,一个不转义的单引号就能让那一行的值提前闭合,后面的内容变成 SQL 的一部分。不过语句本身合不合法是另一回事:类型是猜的、列名来自表头,执行前仍要自己过一遍。
为什么有些数字变成了字符串,有些没有?
因为默认的判据是往返无损耗:把文本转成数字、再转回文本,与原来一模一样才转。`30` 转成 30 再转回来还是 `30`,所以转;`007` 转成 7 再转回是 `7`,与原串不同,所以保持 `"007"`;`1.50` 同理保持原样;超过 2^53 的整数(比如 20 位的订单号)转成数字会丢尾数,也保持字符串。这样既拿到了数字类型,又不会不可逆地改掉数据。要全部按文本读,把「数字怎么读」改成「全部按文本」。
分隔符是怎么判断的?
在逗号、分号、制表符、竖线里挑一个能让每一行列数相同的。不用「出现次数最多」是因为那会被数据内容骗到:一份分号分隔的表,如果备注列里写了几个逗号,逗号的总数可能比分号还多,按计数判会整表错位。都不满足时(比如每一行列数本来就不齐)退回逗号。认错了就手动选一个,选项在结果上方。
为什么整行的空行不见了?
空行会被跳过。手工编辑过的 CSV 里常见空行,Excel 与各家工具读它时都不产生数据行;留着的话 JSON 里会多出一条 `{"id":"","name":""}` 之类的空记录。代价是「单列 CSV 里某一行的值恰好为空」也会被一起丢掉 —— 单列且有空值的表,建议先补一列占位再转。
嵌套的对象(数组)怎么办?
压成 JSON 文本放进单元格,比如 `{"a":{"x":1}}` 会变成一格里写着 `{"x":1}`。CSV 只有行与列,没有嵌套的位置 —— 另一条路是展开成多列(`a.x`),但那要求列名里允许点号,而且单向不可逆。真要保留结构,把结果留在 JSON 里,不要转成 CSV。
Excel 打开输出会有问题吗?
不会。JSON → CSV 的输出用 CRLF 换行,这是 RFC 4180 规定的、也是 Excel 唯一无条件认的一种;含逗号或换行的字段都加了引号,所以不会错位。反方向(Excel 导出的 CSV 粘进来)也处理了它写在开头的 BOM —— 不剥掉的话第一个键名里会多一个看不见的字符(U+FEFF),打印出来和 `id` 一模一样,但用 `obj.id` 永远取不到。

相关工具