返回

用Rust实现CSV解析的第二部分

见解分享

在这一节中,我们将暂时抛开 uspop.csv 数据集,而是展示如何读取一些不太“干净”的 CSV 数据。这个 CSV 数据使用 ; 作为分隔符,带有转义的引号 "(不是"")并且拥有可变长度的记录。下面是一些示例数据,如果你知道 WWE 的话,可以看出其中是一些 WWE 摔跤手的比赛记录:

"Randy Orton";"Triple H";"WrestleMania 25";2009
"John Cena";"Shawn Michaels";"WrestleMania 23";2007
"The Undertaker";"CM Punk";"WrestleMania 29";2013
"Stone Cold Steve Austin";"The Rock";"WrestleMania 17";1999
"Hulk Hogan";"Andre the Giant";"WrestleMania 3";1987

我们可以看到,这个 CSV 数据与我们之前处理过的 uspop.csv 数据集有很大的不同。首先,它使用 ; 作为分隔符,而不是逗号。其次,它带有转义的引号 ",这意味着引号可以作为字段值的一部分。第三,它拥有可变长度的记录,这意味着有些记录可能比其他记录包含更多的字段。

为了解析这个 CSV 数据,我们需要使用 Rust 的 csv 库。这个库提供了许多有用的函数来帮助我们解析 CSV 数据。首先,我们需要创建一个 CsvReader 对象。这个对象可以从一个文件、一个字符串或一个缓冲区中读取 CSV 数据。在我们的例子中,我们将从一个字符串中读取数据:

use csv::CsvReader;

let csv_data = "Randy Orton;Triple H;WrestleMania 25;2009
John Cena;Shawn Michaels;WrestleMania 23;2007
The Undertaker;CM Punk;WrestleMania 29;2013
Stone Cold Steve Austin;The Rock;WrestleMania 17;1999
Hulk Hogan;Andre the Giant;WrestleMania 3;1987";

let mut csv_reader = CsvReader::from_reader(csv_data.as_bytes());

接下来,我们需要创建一个迭代器来迭代 CSV 数据中的记录。这个迭代器将返回一个元组,其中包含记录中的字段。在我们的例子中,我们将创建一个迭代器来迭代 csv_reader 对象中的记录:

for result in csv_reader.records() {
    // Process the record
}

现在,我们可以使用迭代器来迭代 CSV 数据中的记录并处理它们。在我们的例子中,我们将打印出每条记录中的字段:

for result in csv_reader.records() {
    let record = result.unwrap();
    println!("{:?}", record);
}

输出结果如下:

["Randy Orton", "Triple H", "WrestleMania 25", "2009"]
["John Cena", "Shawn Michaels", "WrestleMania 23", "2007"]
["The Undertaker", "CM Punk", "WrestleMania 29", "2013"]
["Stone Cold Steve Austin", "The Rock", "WrestleMania 17", "1999"]
["Hulk Hogan", "Andre the Giant", "WrestleMania 3", "1987"]

我们可以看到,csv 库成功地解析了 CSV 数据,并将其转换为 Rust 数据结构。

在这一节中,我们展示了如何使用 Rust 的 csv 库解析一些不太“干净”的 CSV 数据。我们学习了如何使用 CsvReader 对象和迭代器来解析 CSV 数据。我们还学习了如何处理带有转义引号和可变长度记录的 CSV 数据。