首页 > 解决方案 > csv 标头之前的东西,当我在 rust 中使用 serde 时如何处理它

问题描述

在 csv header(time,ampl) 之前,有一些“无效”数据。

csv是关于:

LECROYWS3024,13568,波形

段,1,SegmentSize,100002

段、TrigTime、TimeSinceSegment1

#1,01-Apr-2021 16:49:34,0

时间,放大器

-2.510018e-005,0

-2.509968e-005,0

-2.509918e-005,0

-2.509868e-005,0

-2.509818e-005,0

...

当我构建并运行exe时,会出现如下错误:

错误是:

CSV 反序列化错误:记录 1(行:1,字节:29):缺少字段Time

如何使用 serde 或其他 crate 处理无效数据?谢谢!

        use std::error::Error;
        use std::io;
        use std::process;
        
        use serde::Deserialize;
        
        #[derive(Debug, Deserialize)]
        struct Record {
            Time: Option<f32>,
            Ampl:Option<f32>,
        }
        ...
fn example() -> Result<(), Box<dyn Error>> {
    let mut rdr = csv::Reader::from_path("foo.csv")?;
    for result in rdr.deserialize() {
            let record: Record = result?;
           let x0= match record.Time{
                Some(x)=> x,
                None=> 0.0,
            };
            ...
     }
    Ok(())
}
fn main() {
    if let Err(err) = example() {
        println!("error running example: {}", err);
        process::exit(1);
    }
}

标签: csvrustserde

解决方案


你可以使用csv crate,它有一个自定义的反序列化器:csv::invalid_option. 然后你可以在你的结构中使用这样的宏:

#[derive(Debug, Deserialize)]
struct Record {
    Time: Option<f32>,
    #[serde(deserialize_with = "csv::invalid_option")]
    Ampl:Option<f32>,
}

将无效数据转换为 None 值


推荐阅读