CSV 转 JSON(也能反过来)— 引号单元格、内嵌换行、长短不齐的行都讲清楚
粘 CSV 得到对象数组,粘 JSON 得到电子表格能直接打开的文本。分隔符、表头行、参差的行列都会明确报告而不是替你猜,每一步都是脚本里的循环,没有服务器见过这段文本,你粘贴的内容不会离开这台设备。
输出
CSV 的读法与键名规则
CSV 那一侧到底怎么读
解析按 RFC 4180 来,也就是电子表格实际使用的那套规则:
- 引号只有在格子开头才算"这是引号格"。 中间出现的
"abc"def把引号当数据保留,不会提前结束字段。 - 连续两个引号是一个引号。
he said ""hi""解出he said "hi"。 - 引号里的换行留在格子内 —— 这正是 CSV 需要解析器、而不能
split(",")加split("\n")打发的原因。 - CRLF 和单独的 LF 都算一次换行,结尾那个换行是让上一行结束,不是再多一条空记录。
- 开头的空行会被跳过(并在补充说明里写清楚跳了几行),否则勾了表头时它会顶替真正的列名。
格子一律保留为字符串。007 还是 007,1e5 还是 1e5,N/A 还是 N/A —— 一个"热心帮你判断类型"的转换器比一个撒谎的更糟,因为下一个程序分不清"丢了前导零的邮编"和"本来就是数字"。
键名、参差的行,以及什么被丢掉了
勾上表头选项后,第一行变成对象键名,之后的每一行变成一个对象。
- 格子少了的行,缺的键补
null:JSON 没法表达"这一列当时不在",而干脆不写这个键会让每条记录的形状各不相同。 - 格子多了的行根本没法表示,所以补充说明会点名第几行、几个格、掉的是什么(截取开头一段)。不做静默截断,这条消息存在的全部意义就是别让你事后才发现。
- 重复的表头名会合并,因为一个 JSON 键只能装一个值;说明里会点一句,而不是让你在结果里自己撞见。
- 表头里的空格子也得有个键名,这类列按位置叫
第3列;补充说明会列出是哪几列。 - 不勾表头时输出是数组的数组,这是唯一能保住长短不一的表格的形状。
反向回到 CSV
反方向接受 JSON 表格可能有的三种形状:
- 对象数组 → 表头取所有键的并集,按第一次出现的顺序排;某条记录缺的键写成空格。
- 数组套数组 → 逐行直接写出,不生成表头(没有键名可用)。
- 单个对象 → 两行:键名当表头,值当数据行。
格子里嵌着对象或数组的,按 JSON 文本写进那一格而不摊平,因为"子对象怎么摊到若干列"没有公认答案;电子表格里会看到花括号,这比编一个规则诚实。含分隔符、含引号、含换行的格子在写出时会加引号,换行用 CRLF,因为那是 Excel 期待的。
常见问题
Q:为什么我的文件全挤成一行? 分隔符和文件不匹配 —— 欧洲的表格软件导出的是分号分隔的 CSV。点分号那个按钮,计数立刻跟着变。数据库客户端导出的则是制表符分隔,同样常见。
Q:我有三万条 JSON 记录。 解析上限是 200,000 字符、5,000 行,超出多少会在补充说明里写清楚。这个体量请拆分文件或换真正的流式工具;让浏览器标签页抱着整个字符串不是合适的做法。
Q:能顺手修好我的乱码吗? 不能。判断文件字节该按哪种编码解释不是这一步的活 —— 你粘进来时它已经是一串 Unicode 了,错着解码的就一直错着。回到产生它的那个软件,另存为 UTF-8。
Q:我的数据会被上传吗? 不会。切分、拼键、加引号、拼 JSON 都是脚本里的循环:表格不进请求体、不经过服务器,你粘贴的内容不会离开这台设备。