10个版本 (1个稳定版)
1.0.0 | 2022年5月25日 |
---|---|
0.1.9 | 2020年7月14日 |
0.1.8 | 2020年1月13日 |
0.1.7 | 2019年10月29日 |
0.1.0 | 2016年12月22日 |
#15 in #cleaning
每月下载量30次
29KB
468 行
scrubcsv: 从CSV文件中删除错误行并规范化其余部分
这是一个基于BurntSushi的出色csv
库的CSV清理工具。它旨在在将数据集输入其他CSV解析器之前清理和规范化大型数据集,代价是丢弃一些行。该程序可能会进一步破坏语法无效的CSV数据!以下为详细信息。
安装和使用
要安装,请先安装Rust,如果您还没有安装的话
curl https://sh.rustup.rs -sSf | sh
然后使用Cargo安装scrubcsv
cargo install scrubcsv
运行它
$ scrubcsv giant.csv > scrubbed.csv
3000001 rows (1 bad) in 51.58 seconds, 72.23 MiB/sec
有关更多选项,请运行
scrubcsv --help
数据清理说明
我们假设,在来自许多来源的数百GB CSV数据中,许多文件将包含一些不可解析的行。
以下形式的行
Name,Phone
"Robert "Bob" Smith",(202) 555-1212
...根据RFC 4180无效,因为"Bob"
的引号未转义。文件创建者可能想写
Name,Phone
"Robert ""Bob"" Smith",(202) 555-1212
scrubcsv
将当前输出为
Name,Phone
"Robert Bob"" Smith""",(202) 555-1212
如果结果行列数错误,则会被丢弃。清理和丢弃的详细信息可能会更改。目标是保留有效CSV文件中的数据,并尽可能地挽救或丢弃无法解析的记录,而不太关注细节。
性能说明
这是设计得相对快速的。为了比较,在特定笔记本电脑上
cat /dev/zero | pv > /dev/null
的吞吐量约为5 GB/s。scrubcsv
中的原始原始输出字符串编写例程可达到约3.5 GB/s。csv
解析器在零复制模式下可以达到约235 MB/s。- 经过不同级别的处理,
scrubcsv
达到49到125 MB/s。 - 许多老式的C命令行工具的吞吐量约为50到75 MB/s。
很遗憾,我们无法真正使用 csv
的零拷贝模式,因为我们需要一次性查看整行,以判断其是否有效,然后再决定是否输出。我想我们可以,将每个字段按我们看到的样子通过 memmove
复制到现有的缓冲区,以避免 malloc
的开销(这几乎肯定是瓶颈所在),但这将需要更多的代码。尽管如此,如果性能有问题,请提交一个问题。我们可能把这个速度提高两到四倍(而且优化起来会很有趣)。
依赖项
~7–16MB
~174K SLoC