您的 Ruby CSV 导入已成功运行 — 您的数据仍可能有误
Source: Dev.to
为什么 Ruby CSV 可能遗漏错误
你真的确定 Ruby CSV 已经完整且正确地导入了所有数据吗?🤔
在提升 smarter_csv 性能的过程中,我加入了一轮新的测试(其中包括从 Ruby CSV 自身测试套件借来的测试)作为 sanity check。这让我思考了各种错误场景,并发现 Ruby CSV 存在多种不抛异常、不给警告、也不提示出错的失败模式。你的导入运行了,测试也通过了,但数据可能悄悄出错了。
Ruby CSV 的 10 种失败模式
我找到了 Ruby 的 CSV.read 可以悄悄损坏或丢失数据的十种方式。下面列出两个具有代表性的例子;完整列表以及可复现的示例可以自行下载运行。
对前导零字符串的数值转换
ZIP 码"00123"会被悄悄转换为83,因为 Ruby CSV 将前导零视为八进制。这不是四舍五入错误,而是完全不同的数字。邮编、客户 ID、订单号等字段可能被替换成错误的整数,却仍能通过校验并看起来合理。分隔符处理错误
用户上传了一个制表符分隔的文件,却使用了.csv扩展名。文件类型检查通过后,Ruby CSV 没有发现逗号,于是把整行当作单个字段返回,数据看似有效,但列结构已经丢失。
你可以在这里下载完整的示例集合:
10 Ways Ruby’s CSV.read Can Silently Corrupt or Lose Your Data (链接到仓库或 gist)
SmarterCSV 1.16
SmarterCSV 1.16 解决了上述十种失败模式。除了修复这些 bug,它还提供了:
- 性能提升:整体比
CSV.read快 1.8×–8.6×。 - 错误行隔离系统:将解析或校验失败的行单独隔离。
- 监控钩子:便于监控和记录解析行为。
了解更多发布信息:
SmarterCSV 1.16 Released (链接到发布说明)
贡献
发现问题了吗?欢迎在 GitHub Discussions 或 Issues 页面提交 issue、反馈或 bug 报告。
如果你有成功案例想分享,期待听到你的故事!