当标题行中可能没有最后一个列名时,使用 Serde 反序列化 CSV

gal*_*p1n 5 csv rust serde

我正在使用csvserdecrates 来反序列化 csv 文件。问题是最后一个字段实际上是一个逗号分隔的列表。

field1,field2,field3
xx, xx, str1, ..., strN
xx, xx,
xx, xx, str1, ..., strM
Run Code Online (Sandbox Code Playgroud)

这就是它在 Rust 中的映射方式,.flexible(true)在阅读器上阅读它:

#[derive(Debug, Deserialize)]
struct Row {
  field1: isize,
  field2: isize,
  field3: Vec<String>,
}
Run Code Online (Sandbox Code Playgroud)

如果 CSV 具有,field3标题行,则一切正常。但有些文件没有它,我找不到让 serde 仍然填充Vec. 我所能做的就是#[serde(default)]放空field3

这是一个 Rust游乐场,显示了问题:

field1,field2,field3
xx, xx, str1, ..., strN
xx, xx,
xx, xx, str1, ..., strM
Run Code Online (Sandbox Code Playgroud)

Sta*_*eur 4

在读取行之前手动添加字段标题应该使用headers()and set_headers()

let rdr = reader.headers().unwrap();
if let None = rdr.get(2) {
    let mut rdr = rdr.clone();
    rdr.push_field("field3");
    reader.set_headers(rdr);
}
Run Code Online (Sandbox Code Playgroud)

然而,那又快又脏。

  • @galop1n 这也有效,但请注意,您的结构将纯粹根据字段的顺序进行反序列化,而不是根据标头中的名称。(这可能适合您的用例!) (4认同)