Rust初学者在这里。
我一直在尝试学习CSV板条箱,但在以下情况下遇到问题。
我的目标是:
首先,这里的代码输出的正是我想要的。
use serde::Serialize;
use serde::Deserialize;
use csv;
use serde_json;
use std::io;
#[derive(Debug,Serialize,Deserialize)]
#[serde(transparent)]
struct Parent {
arr_field: Vec<Row>
}
#[derive(Debug,Serialize,Deserialize)]
struct Row {
a: u8,
b: u8,
c: u8,
}
fn main() {
let resp = r#" [[1,2,3],[3,2,1],[4,5,6]] "#;
let mut wtr = csv::WriterBuilder::new().from_writer(io::stdout());
let v: Parent = serde_json::from_str(resp).unwrap();
for row in v.arr_field{
wtr.serialize(row);
}
}
此代码的输出是:
a,b,c
1,2,3
3,2,1
4,5,6
但是当我想将输出保存到本地文件而不是stdout时,如下所示:
let mut wtr = csv::WriterBuilder::new().from_path("./foo.csv");
我在收到以下错误 wtr.serialize
error[E0599]: no method named `serialize` found for enum `std::result::Result<Writer<File>, csv::Error>` in the current scope
感谢您的帮助。
错误消息告诉您所有您需要知道的-from_path
返回aResult
而不是a WriterBuilder
,因为打开该文件可能并不总是有效。区别在于from_writer
-无需打开文件,因此不会遇到错误。
要解决此问题,您只需使用.unwrap()
,就像serde_json::from_str
下面的代码行一样。遇到错误时,这将导致紧急情况,立即终止程序。
let mut wtr = csv::WriterBuilder::new().from_path("./foo.csv").unwrap();
请注意,这serialize
还会返回结果,因此,您还应该添加.unwrap()
for或其他逻辑来处理for循环中的错误。Rust可能会显示警告,指出有未使用的结果。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句