Обработка CSV
Чтение CSV записей
Считывает стандартные CSV записи в csv::StringRecord
- слабо типизированное представление данных, которое ожидает допустимые строки UTF-8. В качестве альтернативы, csv::ByteRecord
не делает никаких предположений об UTF-8.
extern crate csv;
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
.
extern crate csv;
#[macro_use]
extern crate serde_derive;
#[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 записей с другим разделителем
Читает записи CSV с delimiter
.
extern crate csv;
use csv::Error;
#[macro_use]
extern crate serde_derive;
#[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
с полем, которое соответствует query
.
Отказ от ответственности: этот пример был адаптирован из the csv crate tutorial.
Обработка неверных CSV данных с помощью Serde
Файлы CSV часто содержат неверные данные. Для этих случаев крейт csv
предоставляет специальный десериализатор csv::invalid_option
, который автоматически преобразует недопустимые данные в значения None
.
extern crate csv;
use csv::Error;
#[macro_use]
extern crate serde_derive;
#[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
.
Сериализация записей в CSV с использованием Serde
В следующем примере показано, как сериализовать пользовательские структуры в виде записей CSV, используя крейт serde.
Преобразование CSV столбца
Преобразование CSV файла, содержащего имя цвета и шестнадцатеричный цвет в файл с именем цвета и rgb цветом. Используется крейт csv для чтения и записи csv файла и serde для десериализации и сериализации строк в/из байт.
Смотри методы csv::Reader::deserialize
, serde::Deserialize
и std::str::FromStr