CSV 处理
读取 CSV 记录
将标准的 CSV 记录读入 csv::StringRecord
——一种弱类型的数据表示方式,它需要 CSV 中的行数据是有效的 UTF-8 字符编码。另外,csv::ByteRecord
对 UTF-8 不做任何预设。
use csv::Error;
fn main() -> Result<(), Error> {
let csv = "year,make,model,description
1948,Porsche,356,Luxury sports car
1967,Ford,Mustang fastback 1967,American car";
let mut reader = csv::Reader::from_reader(csv.as_bytes());
for record in reader.records() {
let record = record?;
println!(
"In {}, {} built the {} model. It is a {}.",
&record[0],
&record[1],
&record[2],
&record[3]
);
}
Ok(())
}
Serde 将数据反序列化为强类型结构体。具体查阅 csv::Reader::deserialize
方法。
use serde::Deserialize;
#[derive(Deserialize)]
struct Record {
year: u16,
make: String,
model: String,
description: String,
}
fn main() -> Result<(), csv::Error> {
let csv = "year,make,model,description
1948,Porsche,356,Luxury sports car
1967,Ford,Mustang fastback 1967,American car";
let mut reader = csv::Reader::from_reader(csv.as_bytes());
for record in reader.deserialize() {
let record: Record = record?;
println!(
"In {}, {} built the {} model. It is a {}.",
record.year,
record.make,
record.model,
record.description
);
}
Ok(())
}
读取有不同分隔符的 CSV 记录
使用制表(tab)分隔符 delimiter
读取 CSV 记录。
use csv::Error;
use serde::Deserialize;
#[derive(Debug, Deserialize)]
struct Record {
name: String,
place: String,
#[serde(deserialize_with = "csv::invalid_option")]
id: Option<u64>,
}
use csv::ReaderBuilder;
fn main() -> Result<(), Error> {
let data = "name\tplace\tid
Mark\tMelbourne\t46
Ashley\tZurich\t92";
let mut reader = ReaderBuilder::new().delimiter(b'\t').from_reader(data.as_bytes());
for result in reader.deserialize::<Record>() {
println!("{:?}", result?);
}
Ok(())
}
筛选匹配断言的 CSV 记录
仅仅 返回 data
中字段(field)与 query
匹配的的行。
免责声明:此实例改编自csv crate 教程。
用 Serde 处理无效的 CSV 数据
CSV 文件通常包含无效数据。对于这些情形,csv
crate 提供了一个自定义的反序列化程序 csv::invalid_option
,它自动将无效数据转换为 None 值。
use csv::Error;
use serde::Deserialize;
#[derive(Debug, Deserialize)]
struct Record {
name: String,
place: String,
#[serde(deserialize_with = "csv::invalid_option")]
id: Option<u64>,
}
fn main() -> Result<(), Error> {
let data = "name,place,id
mark,sydney,46.5
ashley,zurich,92
akshat,delhi,37
alisha,colombo,xyz";
let mut rdr = csv::Reader::from_reader(data.as_bytes());
for result in rdr.deserialize() {
let record: Record = result?;
println!("{:?}", record);
}
Ok(())
}
将记录序列化为 CSV
本实例展示了如何序列化 Rust 元组。csv::writer
支持从 Rust 类型到 CSV 记录的自动序列化。write_record
只写入包含字符串数据的简单记录。具有更复杂值(如数字、浮点和选项)的数据使用 serialize
进行序列化。因为 csv::writer
使用内部缓冲区,所以在完成时总是显式刷新 flush
。
用 Serde 将记录序列化为 CSV
下面的实例展示如何使用 serde crate 将自定义结构体序列化为 CSV 记录。
转换 CSV 文件的列
将包含颜色名称和十六进制颜色值的 CSV 文件转换为具有颜色名称和 rgb 颜色值的 CSV 文件。使用 csv crate 读写 csv 文件,使用 serde crate 对行输入字节进行反序列化,对行输出字节进行序列化。
详细请参阅 csv::Reader::deserialize
、serde::Deserialize
,以及 std::str::FromStr
。