繁体   English   中英

CSV from_writer 在 stdout() 上工作,但在 from_path 上失败

[英]CSV from_writer works on stdout(), but fails on from_path

Rust 初学者在这里。

我一直在尝试学习 CSV 板条箱,但遇到了以下情况。

我的目标是:

  1. 解析嵌套数组
  2. 将列名设置为数组值
  3. 写入 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);
    }
}

该代码的output为:

a,b,c
1,2,3
3,2,1
4,5,6

但是当我想将 output 保存到本地文件而不是标准输出时,如下所示:

    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返回Result而不是WriterBuilder ,因为打开该文件可能并不总是有效。 这与from_writer不同 - 不需要打开文件,因此不可能遇到错误。

要解决此问题,您可以使用.unwrap() ,就像使用下面的serde_json::from_str一样。 当遇到错误时,这将导致恐慌,立即终止您的程序。

let mut wtr = csv::WriterBuilder::new().from_path("./foo.csv").unwrap();

请注意, serialize也会返回结果,因此您还应该添加.unwrap()或其他一些逻辑来处理 for 循环中的错误。 Rust 可能会显示一条警告,指出存在未使用的结果。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM