- Rust and CSV parsing 译文(用 Rust 实现 csv 解析-part4)
- 原文链接:https://blog.burntsushi.net/csv/
- 原文作者:BurntSushi
- 译文来自:https://github.com/suhanyujie/article-transfer-rs/
- 译者:suhanyujie
- 译者博客:suhanyujie
- ps:水平有限,翻译不当之处,还请指正。
- 标签:Rust,csv
分隔符,引号和可变长度的记录
在这一节中,我们将暂时抛开 uspop.csv 数据集,而是展示如何读取一些不太“干净”的 CSV 数据。这个 CSV 数据使用 ;
作为分隔符,带有转义的引号 \"
(不是""
)并且拥有可变长度的记录。下面是一些示例数据,如果你知道 WWE 的话,可以看出其中是一些 WWE 摔跤手及其出生年份的名单:
$ cat strange.csv
"\"Hacksaw\" Jim Duggan";1987
"Bret \"Hit Man\" Hart";1984
# We're not sure when Rafael started, so omit the year.
Rafael Halperin
"\"Big Cat\" Ernie Ladd";1964
"\"Macho Man\" Randy Savage";1985
"Jake \"The Snake\" Roberts";1986
要读取这些 CSV 数据,我们按照下面的思路来:
- 1.不读取 header,因为没有 header 部分
- 2.将分隔符由
,
改为;
。 - 3.将双引号(如
""
)的后半部分转义(如\"
) - 4.支持灵活的可变长度记录,因为其中可能会有年份缺省。
- 5.忽略行首是
#
的行
所有这些(也许有更多其它的)都可以通过配置 ReaderBuilder 来实现,如下方示例:
fn run() -> Result<(), Box<Error>> {
let mut rdr = csv::ReaderBuilder::new()
.has_headers(false)
.delimiter(b';')
.double_quote(false)
.escape(Some(b'\\'))
.flexible(true)
.comment(Some(b'#'))
.from_reader(io::stdin());
for result in rdr.records() {
let record = result?;
println!("{:?}", record);
}
Ok(())
}
现在重新编译项目并以 strange.csv
作为输入参数来运行它:
$ cargo build
$ ./target/debug/csvtutor < strange.csv
StringRecord(["\"