rust - CSV from_writer 适用于 stdout(),但在 from_path 上失败
问题描述
这里是 Rust 初学者。
我一直在尝试学习 CSV 板条箱,但陷入了以下情况。
我的目标是:
- 解析嵌套数组
- 将列名设置为数组值
- 写入 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
但是当我想将输出保存到本地文件而不是标准输出时,如下所示:
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 循环中的错误。Rust 可能会显示一个警告,指出有一个未使用的结果。
推荐阅读
- android - API26 中的锁屏上未显示通知
- tensorflow - 没有为自定义分段损失函数的任何变量提供梯度
- angular - Ngx-Spinner 在功能模块中不起作用
- python - 函数定义中的奇怪 *
- python-3.x - 在绘图函数运行之前增加变量增量
- solr - 如何在 SOLR 中查询 fieldType LatLonPointSpatialField 的空字段
- java - 无法在我的项目中使用 @Slf4j 注释,因为无法解析为类型,但在另一个项目中运行良好
- sockets - Socket 包装器是 TCP/IP 的传输层吗?
- oracle - Oracle Rest Data Service Order by desc nulls last 不起作用
- sql - 如何从重叠日期中获取单独的间隔