没有 header 的 Rust 读取 CSV
Rust Read CSV without header
如何在 Rust 中读取没有 header 的 CSV?我搜索了文档并浏览了大约 15 个示例,每个示例都不是我要找的。
想想 Python 是多么容易:
csv.DictReader(f, fieldnames=['city'])
你如何在 Rust 中做到这一点?
当前尝试:
use std::fs::File;
use serde::Deserialize;
#[derive(Debug, Deserialize)]
struct CityRow {
city: &str,
pop: u32,
}
fn doit() -> zip::result::ZipResult<()>
{
let filename = "cities.csv";
let mut zip = zip::ZipArchive::new(File::open(filename).unwrap())?;
let mut file = zip.by_index(0).unwrap();
println!("Filename: {}", file.name());
let mut reader = csv::Reader::from_reader(Box::new(file));
reader.set_headers(csv::StringRecord([ "city", "pop" ]));
for record in reader.records() {
// let record: CityRow = record.unwrap();
// let record = record?;
println!("{:?}", record);
}
Ok(())
}
使用 ReaderBuilder
,并调用 ReaderBuilder::has_headers
to disable header parsing. You can then use StringRecord::deserialize
来提取和打印每条记录,跳过第一个 header 行:
let mut reader = csv::ReaderBuilder::new()
.has_headers(false)
.from_reader(Box::new(file));
let headers = csv::StringRecord::from(vec!["city", "pop"]);
for record in reader.records().skip(1) {
let record: CityRow = record.unwrap().deserialize(Some(&headers)).unwrap();
println!("{:?}", record);
}
如何在 Rust 中读取没有 header 的 CSV?我搜索了文档并浏览了大约 15 个示例,每个示例都不是我要找的。
想想 Python 是多么容易:
csv.DictReader(f, fieldnames=['city'])
你如何在 Rust 中做到这一点?
当前尝试:
use std::fs::File;
use serde::Deserialize;
#[derive(Debug, Deserialize)]
struct CityRow {
city: &str,
pop: u32,
}
fn doit() -> zip::result::ZipResult<()>
{
let filename = "cities.csv";
let mut zip = zip::ZipArchive::new(File::open(filename).unwrap())?;
let mut file = zip.by_index(0).unwrap();
println!("Filename: {}", file.name());
let mut reader = csv::Reader::from_reader(Box::new(file));
reader.set_headers(csv::StringRecord([ "city", "pop" ]));
for record in reader.records() {
// let record: CityRow = record.unwrap();
// let record = record?;
println!("{:?}", record);
}
Ok(())
}
使用 ReaderBuilder
,并调用 ReaderBuilder::has_headers
to disable header parsing. You can then use StringRecord::deserialize
来提取和打印每条记录,跳过第一个 header 行:
let mut reader = csv::ReaderBuilder::new()
.has_headers(false)
.from_reader(Box::new(file));
let headers = csv::StringRecord::from(vec!["city", "pop"]);
for record in reader.records().skip(1) {
let record: CityRow = record.unwrap().deserialize(Some(&headers)).unwrap();
println!("{:?}", record);
}