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 空格与制表符
使用方法
- 把 CSV / TSV 或 JSON 粘进输入框 —— 能解析成 JSON 的按 JSON 处理,其余按 CSV
- 方向、分隔符、有没有表头都可以手动指定
- 结果是实时的;如果分隔符认错了,手动选一个再看
- 点复制取走结果
常见问题
- 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` 永远取不到。
相关工具
YAML 转换
格式化YAML 与 JSON 双向互转:多文档、锚点别名与合并键都按规范处理,大整数不丢精度,解析错误指出行列位置。全部在浏览器本地完成。
JSON 格式化
格式化在线 JSON 格式化与校验工具:树形折叠浏览、搜索键值、逐节点改值与删除、语法错误定位到具体行列,输入框带行号与高亮。全部在浏览器本地完成。
按列截取
文本从每行里取出指定的列:按分隔符分列或按字符位置截取,支持 2-4 区间与负数(从末尾数),取不到就留空。
JSON 转代码
格式化把 JSON 样本转成 TypeScript interface、Go struct、Java class 或 Rust struct:不齐的键标成可选、类型冲突退化为联合类型。全程在浏览器本地生成。
SQL 格式化
格式化在线 SQL 格式化:关键字统一大小写、按 SELECT / FROM / WHERE 等子句换行缩进、子查询逐层展开,压缩模式去掉多余空白与注释。语句不上传服务器。
JSON5 转换
格式化把 JSON5 解析成标准 JSON:注释、无引号键、单引号、尾逗号、十六进制、Infinity 都支持,错误指出行列。全部在浏览器本地完成。