csv - 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);
}
}
解决方案
你可以使用csv crate,它有一个自定义的反序列化器:csv::invalid_option
. 然后你可以在你的结构中使用这样的宏:
#[derive(Debug, Deserialize)]
struct Record {
Time: Option<f32>,
#[serde(deserialize_with = "csv::invalid_option")]
Ampl:Option<f32>,
}
将无效数据转换为 None 值
推荐阅读
- matlab - 我可以在 matlab 中使用 imfilter 计算两个图像之间的相关性吗?
- javascript - 制作一个按下或单击执行功能的按钮,直到松开按钮
- r - 使用 R 中的新 Tesseract OCR 引擎将许多 .pdf 文件转换为 .txt 文件
- jetty - 码头服务器 HttpConnection IllegalStateException: s=DISPATCHED i=true a=null
- sas - 使用数据步骤对两个表进行 SAS 版本控制
- python - 将包含浮点运算符的 str() 转换为 float()
- javascript - 已声明标识符
- mysql - 如果给定字段相同,则使用新行的值更新现有行
- jenkins - 如何在詹金斯管道中获取触发作业的构建网址?
- html - 单击 iframe 内的任何链接时未显示浏览器默认加载程序图标