用cat命令看CSV文件,列总是滑出终端右边缘。你其实不想为确认八行数据而打开电子表格。csv-peek customers.csv能在1毫秒内打印出对齐的表格——数字右对齐显示青色,日期黄色,布尔值洋红色,"hello, world"里的嵌入逗号不会破坏对齐,因为解析器真正理解引号规则。单依赖(clap),剥离后二进制文件小于1MB,51个测试用例。

GitHub地址:https://github.com/sen-ltd/csv-peek

打开网易新闻 查看精彩图片

Rust有成熟的csv crate。真正的生产工作,那是标准答案。但作者还是选择了手写解析器,两个原因:整个解析器只有src/csv.rs里的200行代码。核心状态机只有四个状态:Start(字段之间)、Unquoted(无引号字段内部)、Quoted(引号字段内部)、QuotedQuote(引号字段内遇到引号)。

QuotedQuote是最微妙的状态。一旦在引号字段内看到引号,你无法立即判断这是闭合引号还是转义对("")的前半部分,必须看下一个字节才能决定。如果是第二个引号,说明是转义,输出字面量引号并留在Quoted状态;如果是分隔符,字段在此结束;如果是换行符,记录在此结束;如果是其他字符,说明输入格式错误,严格解析器会报错,但csv-peek选择容错——追加字节并回退到Unquoted状态继续解析。

这种容错设计源于csv-peek的定位:让你看到实际存在的内容,即使内容是损坏的。"foo"bar\n会被解析为foobar。生产级解析器遇到格式错误应该崩溃,但一个用来快速扫一眼数据的工具,作者认为渲染出某些内容比直接失败更有价值。