没有 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);
}

(playground)