Rust读取没有标题的CSV

4

如何在Rust中读取没有标题的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(())
}

在Python示例中,您使用Pandas库来管理数据。在Rust代码中,您是否使用类似的DataFrame库(例如polars)来管理数据? - smitop
1
抱歉,不是的,只是像csv crate示例一样读取普通的csv文件,但没有标题。 - Test
你能否在问题中添加你目前如何使用 csv 包来提取行?有几种方法可以做到这一点(主要区别在于是否使用 Serde)。csv::ReaderBuilder::has_headers 可能会有所帮助,但我需要看到代码才能测试。 - smitop
1
没问题,已完成。 - Test
2个回答

3
使用ReaderBuilder,并调用ReaderBuilder::has_headers来禁用标题解析。然后,您可以使用StringRecord::deserialize提取和打印每个记录,跳过第一行标题:
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)


2
@smitop的回答对我来说并不完全有意义,因为该库似乎默认假定标题存在,这在查看底层代码时并不是很明显。这意味着实际上下面的代码应该直接起作用,而且我发现它确实起作用了:
    let mut reader = csv::Reader::from_reader(data.as_bytes());
    
    for record in reader.deserialize() {
        let record: CityRow = record.unwrap();
        println!("{:?}", record);
    }

我在这个示例代码平台中查找了一些变量。
就我所知,实际上在我的情况下,我不小心留下了一个读取csv文件作为纯文本文件的代码路径,这就是我看到标题被读取成行的原因。(糟糕!)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接