我这里有一个非常简单的结构,可以从字符串反序列化
#[cfg(test)]
mod tests {
use csv;
#[derive(Debug, serde::Deserialize)]
struct Test {
x: f64,
#[serde(default)]
up: f64,
}
#[test]
fn deserialise() {
let s = "x,up\n0.0,";
let mut rdr = csv::Reader::from_reader(s.as_bytes());
for row in rdr.deserialize() {
let option: Test = row.expect("Failure");
dbg!(&option);
}
}
}
我希望字段“up”默认为0.0,因为它在文件中丢失。使用up: Option<f64>
是可行的,但它不是数据模型的真正表示。
我做错了什么?
它失败了
thread 'tests::deserialise' panicked at 'Failure: Error(Deserialize { pos: Some(Position { byte: 111, line: 2, record: 1 }), err: DeserializeError { field: Some(12), kind: ParseFloat(ParseFloatError { kind: Empty }) } })', data_model\examples\upload_options.rs:80:41
Cargo.toml:
[package]
name = "data_model"
version = "0.1.0"
edition = "2021"
[dependencies]
serde = { version = "^1.0", features = ["derive"] }
csv = "^1"
1条答案
按热度按时间56lgkhnf1#
登录https://github.com/BurntSushi/rust-csv/issues/109#issuecomment-372709974。
这是CSV格式的一个限制,因为它不能区分空字符串和不存在的单元格。因此,您需要通过告诉serde将空单元格反序列化为默认值来解决这个问题。