#csv #line #bad #normalize #file #rest #cleaning

app scrubcsv

从大型CSV文件中删除错误行并规范化其余部分

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次

MIT/Apache

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