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谢谢!我花了一段时间才理解您的解决方案是如何工作的,但最终我还是得到了:)