12000行客户导出给我发来装入分期数据库,我转了,导入,发货,两天后他们的ops lead问为什么新泽西几百个客户有四位数的邮编。
07102 已经成为 7102。每个以零开头的 zip, 横跨整个文件, 悄悄地截肢。不是bug - 由一个特性。类型推断看着 07102、看到与"一个数字,"匹配的东西,并有益地将其转换为一个。前导零不是数字所拥有的东西。
我建造了 CSV 到 JSON 转换器 toolz。dev上,它也这样做。i'm将向您准确地显示在哪里,因为一个默默地改变数据的转换器比一个刚刚失败的转换器更危险。
TL;博士: 的 CSV 到 JSON 转换器 CSV变成一个对象数组,使用第一行作为密钥,完全在你的浏览器中运行。它 始终推断类型 您可以在 UI 中关闭它 - 这意味着
07102→7102、1250.50→1250.5,空单元格→null、和true/false→ 布尔。超过 25³ stay 字符串的大整数,可保存您的 Twitter ID。It's 仅逗号 interface中,所以来自欧洲excel的分号csv赢了't解析重复的标头是一个硬错误而不是一个无声覆盖-那个's是对大多数解析器的真正改进,在导入之前检查输出,并使用 json格式化程序 去观察它。
该转换器实际上对您的数据有何作用?
CSV 中的每个值都是文本。 29 是人物 2 並 9。JSON有实数类型,所以一个转换器必须决定:是 29 29的数字或字符串"29"?那里's一般没有正确的答案,每个csv解析器都猜测。
This one猜测。Always。here's完整的规则集, 直接从代码中, 并通过运行它来验证:
| CSV值 | JSON 输出 | 类型 |
|---|---|---|
29 |
29 |
號 |
07102 |
7102 |
数字--零消失了 |
1250.50 |
1250.5 |
数字-美分消失了 |
true / TRUE |
true |
布尔 |
null / NIL |
null |
零 |
| (空格) | null |
零 |
9007199254740993 |
"9007199254740993" |
弦 |
1e3 |
1000 |
號 |
+5 |
"+5" |
弦 |
.5 |
".5" |
弦 |
NO |
"NO" |
弦 |
+8801712345678 |
"+8801712345678" |
弦 |
2024-01-05 |
"2024-01-05" |
弦 |
其中一些值得仔细观察,因为图案是't明显的。
Regex这个数字是严格的,而那's承重。 它匹配 ^-?\d+$ 其他什么都没有。那'为什么 +5 並 .5 strings的方式生存- 没有前导加,没有裸小数点。it's也是为什么 +8801712345678- 一个孟加拉国的电话号码,我用我的电话号码测试 - 完整地通过。剥离那个 + and you'd 输给数值转换,所以正则表达式的严格性是不小心保护了电话号码,只有保留了他们的国家代码 plus 的电话号码。
大整数处理得当,这让我很惊讶。 JavaScript's安全整数范围(±25³−1)之外的任何东西都被故意保留为字符串,而不是转换和破坏,雪花ID、Twitter ID和19位数据库密钥幸存下来,大多数天真的转换器调用 parseInt 并把你递给你 9007199254740992 你在哪里 ...93.本先查绑定。
NO 保持字符串- 悄悄躲开了吃掉YAML文件的挪威问题 不同的格式,不同的解析器,但值得注意的是:国家代码 NO 是针对配置解析器如何处理它的抛硬币,在这里它's安全。
空意味着空,而不是空字符串。 在这里's我发现了一个小文档错误,写了这个:工具'自己的"它是如何工作的"面板上说 "空值在JSON输出中作为空字符串保留。" 他们是't。 inferType('') 返回 nullUI文字错误;代码是出货的 I'm 修复副本。
07102为什么变成7102,我该怎么办?
因为邮政编码不是数字,计算机可以't告诉。
07102 匹配"数字,可选否定"完美。 parseInt("07102", 10) 於 7102.前导零承载意义- 它 ... data-和数字是没有办法持有,同样的事情也发生了:
- 邮政编码:
07102、01950、新英格兰或新泽西的任何东西 - 产品 SKU:
00451 - 没有加号的电话号码:
0171... - 银行/路由代码、 员工身份证、 任何已填充的标识符
- 钱:
1250.50→1250.5、和2100.00→2100
最后一个值得坐在一起。 1250.50 並 1250.5 是同一个数字,不同的字符串,如果你'渲染货币下游, $1250.5 is要出现在某个地方的ui中,有人会提交一个bug,需要一个小时才能追溯到三周前的csv转换。(那里的真正教训是将钱存储为整数美分或十进制字符串,永远不会是浮动的 - 但那's为不同的文章而战。)
现在,在这个工具中,有 无需切换即可关闭推理。 底层函数取 a inferTypes option和ui从来没有通过它,所以它's on,永久,默认。that's一个间隙,它's这个工具的我的列表中的顶部项目。
在发货之前,您的选择:
- 看输出。 Seriously - 这就是为什么工具显示JSON在一个窗格而不是仅仅下载它扫描你的ID列需要十秒钟和它's我应该如何抓住邮政编码。
- 上游有报价证明。 CSV中的引用赢了't帮助 - 解析器条引号和 然后 推断,所以
"07102"仍然成为7102.而是使该值在源头处非数字化:导出为ZIP-07102的,或者在电子表格中添加前缀列。 - 后期过程。 Convert, 然后修复你知道的列是标识符:
data.forEach(r => r.zip = String(r.zip).padStart(5, '0')).丑陋,但诚实和可审计。 - 使用真实解析器进行真实管道。 对于任何预定或自动化的事情,
csv-parse或者 Papa Parse 在 Node with 中cast: falsewill 正确地做到这一点,浏览器工具是针对一次性的。
解析器正确得到什么?
I'一直很努力,所以在这里'的另一半 - 而其中一些真的比你'在其他地方会发现。
重复的标头是一个严重错误。 喂它 a,b,a 它拒绝了: Duplicate headers found: a.大多数解析器默默地让最后一列获胜,所以一列数据消失得无影无踪,这里大声失败就是正确的调用- 在一个JSON对象中不能有两个同名的键,假装否则丢失数据。
引用的字段处理得当、每 RFC 4180。引号内的逗号保持原位; "" 成字面意思 "。 样本数据随附 "Mike, Jr." 专门为了证明这一点。
引用字段内的换行符有效。 这就是手动卷绕的 CSV 分体通常死亡的地方 - 有人分体 \n 并且多行地址字段引爆整个文件。分行器逐个字符跟踪引用状态,因此 "line1\nline2" 保持一个字段。
跳过空行故尾随换行符和末尾的杂散空行 Excel 离开 don't 产生幻象对象。
破烂的行不't崩溃。 字段太少,缺失的键又回来了 null;太多和额外的通过你的头数默默地下降。(最后部分I'd调用有争议而不是正确 - 一个警告会比一个安静的丢弃更好。)
需要了解一个 RFC 偏差: 值被修剪,包括内部报价。 RFC 4180 §2.4说空间是字段的一部分,应该't被忽略,所以 " John " 应该 " John "。这个工具给你 "John"。那's故意的便利 - 99%的时间在CSV中跟踪空白是你想要去的意外 - 但如果你're往返数据,其中填充是重要的,它's有损步骤,规格不在我这边。
Why Won't 我的分号CSV解析?
因为界面仅限逗号,这可以捕获每个欧洲导出。
使用逗号作为小数分隔符的区域设置中的 Excel 写入 CSV 分号 为字段分隔符。完全有效,极为常见,而此工具不会解析。粘贴 a;b 你会得到一个字面命名的键 a;b 以值 "1;2"。它不't错误- 它只是产生一个无用的列,这比错误更糟糕。
解析函数接受a delimiter option。ui从来不暴露它。与推理切换的差距的同一类。
解决方法:
- 查找并替换
;→,首先在文本编辑器中 - 安全 仅限 如果没有字段包含引号内的逗号。 - 从 Excel 重新导出 与 "CSV UTF-8(逗号界定)"。
- 使用 CSV 查看器 相反 - 它通过对候选分隔符之间的列计数一致性进行评分来进行分隔符检测,因此它会读取您的分号文件。它赢了't转换为JSON,但它'将向您展示您拥有的内容。
Tabs也有同样的问题,管道分隔也是如此。
如何在 Toolz。dev 上将 CSV 转换为 JSON?
1步:打开转换器
去 CSV 到 JSON 转换器。样本数据已加载并已转换,因此您可以立即看到形状。
第 2 步:粘贴您的 CSV
Paste到左侧的窗格中。那里's 无文件上传- it's 文本区域,所以打开你的 .csv 在文本编辑器中并复制。对于几千行 that's 罚款。对于 200 MB 导出,请使用真实解析器。
您的第一行必须是标头,并且您至少需要一行数据。单行返回 CSV must have at least a header row and one data row。
3步:转换
击 转换为 JSON。你得到一个对象数组,每行一个,从头部键,缩进两个空格。行数出现在输出上方 - 根据你的期望检查它,因为它's最便宜的理智测试。
4步:在信任输出之前读取输出
大家跳过我跳过一次的步骤 看看你的ID列 看看你的钱列 如果一个邮编显示在JSON中没有引用,它's现在的一个数字。
5步:复制或下载
复印 为剪贴板, 下载 JSON 为a data.json 文件。
我什么时候不应该使用浏览器转换器?
对边界诚实:
| 情况 | 用 |
|---|---|
| 一次性,几千行 | CSV 转 JSON |
| 敏感数据您可以't上传 | 这 - 它永远不会离开您的浏览器 |
| 任何预定或自动化的事情 | csv-parse /节点中的 Papa 解析 |
| 分号或选项卡分隔 | CSV 查看器的,或者修定分隔符 |
| 邮政编码、SKU、带衬垫的 ID | 任何与 cast: false |
| 来自虚线标头的嵌套输出 | 脚本 - 这仅生成平面对象 |
| 100k 行的以上 | 流解析器;浏览器将其全部存储在内存中 |
| 走另一条路 | json to csv |
那个"嵌套输出"行值得简单地说明,因为旧版本的本指南另有要求:标题类似 user.name 並 address.city 做 不是 成嵌套对象。你得到一个平坦的对象,上面有一个按字面命名的键 "user.name"。There's 没有点符号扩展,没有标头转换,没有camelCase转换。扁平对象,键与在你的标头行中输入的一模一样- 空格,哈希值,以及所有。的标头 Order # 给你一把钥匙 "Order #"的,这是合法的 JSON 和尴尬的 JavaScript (row["Order #"])。
reach for this tool的原因与站点的其他部分的原因相同:您的数据不't去任何地方如果你're转换客户导出,其中包含真实姓名和电子邮件,那's不是一个小事-粘贴到服务器端转换器意味着向第三方递交个人数据文件,这是与您的DPO的对话你'宁愿没有在这里解析运行在您的选项卡中关闭您的Wi-Fi,它仍然有效。
常见问题
为什么我的邮政编码失去了前导零?
因为类型推理将其转换为数字,并且数字可以't存储前导零。 07102 与 " 仅数字" 匹配模式,因此它成为 7102。这会影响邮政编码,带衬垫的SKU,员工ID,以及任何恰好是所有数字的标识符。在CSV won't help - 引号中引用在推理运行之前被剥离。在输出中检查您的ID列,或在源头处添加值前缀,使它们成为非数字。
我可以关闭自动类型转换吗?
Not在界面中。底层功能支持一个 inferTypes option,但是ui没有't暴露出来,所以推理总是打开的,如果需要原始字符串,使用库解析器,如papa Parse或 csv-parse 禁用铸造,或在转换后修复受影响的柱。
它支持分号或选项卡分隔文件吗?
No - 界面是仅逗号的。分号文件解析为一个无意义列而不是错误,所以请注意。先用逗号替换分号(只有在没有引用的字段包含逗号时才安全),从 Excel 重新导出为逗号分隔,或者使用 CSV Viewer,它会自动检测分隔符。
空细胞会发生什么?
他们成为 null的, 不是空字符串 注意工具'sown "它是如何工作的"面板目前说的相反-面板文本错误,代码正确 包含字面文本的单元格 null 或 nil 也成为 null。
我可以转换没有头行的 CSV 吗?
No。1 行始终被视为标头,只有一行的文件返回一个错误,说它需要标头加上至少一个数据行,如果您的数据没有标头,则在粘贴之前在文本编辑器中添加一个。
它是否处理引号字段内的逗号和换行符?
是的,两者都是。解析器逐个字符跟踪引用状态字符,因此字段类似 "Mike, Jr." keeps its逗号,而一个包含换行符的引用字段停留在单个值而不是拆分行。转义双引号(""根据 RFC 4180,) 成为单个字面报价。
重复的列名会发生什么?
它拒绝转换并告诉您哪个标头重复。that's故意 - 一个JSON对象可以't有两个相同的键,所以替代方案是默默地丢弃一个列。许多解析器正是这样做的;重命名列并再次转换。
有行限制吗?
No 强制限制,但一切都在你的浏览器中运行's内存:CSV文本、解析数组、格式化JSON字符串都一次存在,几千行舒服;六位数行数会让标签挣扎,对于大了的文件,改用Node中的流解析器。
我的数据是否上传到任何地方?
号解析发生在你的浏览器中,你的CSV永远不会被传输,这就是它对客户导出和其他你无法做到的数据的安全的原因't合法地粘贴到服务器端的工具中,以简单的方式验证它 - 打开DevTools,在转换时观看网络选项卡,或者只是关闭你的Wi-Fi,看看它仍然有效。
简短版本
CSV到JSON看起来像是计算中最无聊的转换,它是't,因为解析器决定你的字符串的那一刻 意味着、don't宣布自己的方式可能错了,没有错误,没有警告,两天后才出现四位数的邮编。
所以:转换一下 读输出、查一下冒充数字的标识符的栏目,如果没有引用出来,你'已经失去了一些东西,那个习惯十秒钟,本来可以给我省下一封尴尬的邮件。
的 CSV 到 JSON 转换器 擅长一次性工作 - 引用字段、嵌入换行符、大整数 ID 以及重复标头上的大声故障,所有这些都不会让您的数据离开浏览器。it's逗号-only,它总是推断类型,它会产生平坦的对象。现在,在它们咬之前,您就知道这三个。
朝另一个方向走: json to csv。用于检查混乱的CSV首先: CSV 查看器。用于检查输出: json格式化程序。并且如果您的数据's标题为配置文件, JSON 到 YAML.游览范围更广的是在 JSON 工具指南 和 编码工具指南。



