Csv 在使用Serde将结构实例写入文件时,如何向其添加额外的数据点?

Csv 在使用Serde将结构实例写入文件时,如何向其添加额外的数据点?,csv,rust,serde,Csv,Rust,Serde,人有名和姓。在将Person的实例写入CSV时,如何将导出到CSV的时间添加到CSV #[macro_use] extern crate serde_derive; extern crate csv; extern crate serde; use std::time::{SystemTime, UNIX_EPOCH}; #[derive(Debug, Serialize, Deserialize)] struct Person { first_name: String, l

。在将
Person
的实例写入CSV时,如何将导出到CSV的
时间添加到CSV

#[macro_use]
extern crate serde_derive;
extern crate csv;
extern crate serde;

use std::time::{SystemTime, UNIX_EPOCH};

#[derive(Debug, Serialize, Deserialize)]
struct Person {
    first_name: String,
    last_name: String,
}

fn current_ms() -> u64 {
    let since_the_epoch = &SystemTime::now().duration_since(UNIX_EPOCH).unwrap();
    let ms = since_the_epoch.as_secs() * 1000 + since_the_epoch.subsec_nanos() as u64 / 1_000_000;
    ms
}

fn main() {
    let person = Person {
        first_name: "Craig".to_string(),
        last_name: "David".to_string(),
    };
    let file_path = std::path::Path::new("test.csv");
    let mut wtr = csv::Writer::from_path(file_path).unwrap();
    wtr.serialize(&person).unwrap();
    println!("{}", current_ms());
}
上述代码导致:

>cat test.csv
名,姓
克雷格,大卫
我的目标是生成以下格式的文件:

>cat test.csv
时间,名字,姓氏
1527661792118,克雷格,大卫

没有添加其他字段的选项。在上面的示例中,
Person
struct不包含
time
值。只有将数据写入CSV时才需要
time
值。

如果不想将时间戳列添加到
Person
,可以为此创建单独的结构,然后将它们连接在一个元组中:

#[derive(Debug, Deserialize, Serialize)]
struct Timestamp {
    time: u64,
}

impl Timestamp {
    fn now() -> Timestamp {
        Timestamp { time: current_ms() }
    }
}

fn main() {
    let person = Person {
        first_name: "Craig".to_string(),
        last_name: "David".to_string(),
    };
    let person_and_time = (Timestamp::now(), person);
    let file_path = std::path::Path::new("test.csv");
    let mut wtr = csv::Writer::from_path(file_path).unwrap();
    wtr.serialize(&person_and_time).unwrap();
}

如果不想将时间戳列添加到
Person
,可以为此创建一个单独的结构,然后将它们连接在一个元组中:

#[derive(Debug, Deserialize, Serialize)]
struct Timestamp {
    time: u64,
}

impl Timestamp {
    fn now() -> Timestamp {
        Timestamp { time: current_ms() }
    }
}

fn main() {
    let person = Person {
        first_name: "Craig".to_string(),
        last_name: "David".to_string(),
    };
    let person_and_time = (Timestamp::now(), person);
    let file_path = std::path::Path::new("test.csv");
    let mut wtr = csv::Writer::from_path(file_path).unwrap();
    wtr.serialize(&person_and_time).unwrap();
}

我相信你的问题得到了我的回答。如果你不同意,请用你的问题来解释不同之处。否则,我们可以将此问题标记为已回答。@Shepmaster我已经更新了帖子,解释了为什么serde属性似乎不是解决方案。您阅读了答案的两部分了吗?我知道这是一个很长的答案,但请阅读带有“创建一个单独结构”的部分。我已重新组织了该答案,以明确提出了两种解决方案。@Shepmaster谢谢!我花了一段时间才明白你的解决方案是如何起作用的,但最后我终于明白了:)我相信你的问题得到了我的答案。如果你不同意,请用你的问题来解释不同之处。否则,我们可以将此问题标记为已回答。@Shepmaster我已经更新了帖子,解释了为什么serde属性似乎不是解决方案。您阅读了答案的两部分了吗?我知道这是一个很长的答案,但请阅读带有“创建一个单独结构”的部分。我已重新组织了该答案,以明确提出了两种解决方案。@Shepmaster谢谢!我花了一段时间才理解您的解决方案是如何工作的,但最终我还是得到了:)