如何使用Serde将其他数据点添加到结构的实例?

时间:2018-05-30 06:36:29

标签: csv rust serde

Person有一个first_name和一个last_name。在将time的实例写入CSV时,如何将Person导出添加到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
first_name,last_name
Craig,David

我的目标是生成格式为

的文件
>>> cat test.csv
time,first_name,last_name
1527661792118,Craig,David

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

1 个答案:

答案 0 :(得分:3)

如果您不想将时间戳列添加到LingerOption lo = new LingerOption(false, 0); s.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.Linger, lo); ,您可以为其创建单独的结构,然后将它们连接在一个元组中:

Person