Rust 如何将数据从csv::StringRecord推送到结构中的每个列向量?
如何实现下面的Rust 如何将数据从csv::StringRecord推送到结构中的每个列向量?,rust,Rust,如何实现下面的推送(&self,row:&csv::StringRecord)特性 输入是对csv库中的csv::StringRecord的引用。其思想是将每一列附加到它的向量上 extern crate csv; #[derive(Debug)] struct DataFrame { header: csv::StringRecord, name: Vec<String>, datetime: Vec<String>, speed: V
推送(&self,row:&csv::StringRecord)
特性
输入是对csv
库中的csv::StringRecord
的引用。其思想是将每一列附加到它的向量上
extern crate csv;
#[derive(Debug)]
struct DataFrame {
header: csv::StringRecord,
name: Vec<String>,
datetime: Vec<String>,
speed: Vec<f32>,
}
impl DataFrame {
fn new() -> DataFrame {
DataFrame {
header: csv::StringRecord::new(),
name: Vec::new(),
datetime: Vec::new(),
speed: Vec::new(),
}
}
fn read_csv(filepath: &str, has_headers: bool) -> DataFrame {
// Open file
let file = std::fs::File::open(filepath).unwrap();
let mut rdr = csv::ReaderBuilder::new()
.has_headers(has_headers)
.from_reader(file);
// Add values to struct
let mut empty_dataframe = DataFrame::new();
empty_dataframe.header = rdr.headers().unwrap().clone();
for result in rdr.records() {
empty_dataframe.push(&result.unwrap());
}
empty_dataframe
}
fn push(&self, row: &csv::StringRecord) {
println!("{:?}", row);
//self.name.push(name);
//self.datetime.push(datetime);
//self.speed.push(speed);
}
}
fn main() {
let data = DataFrame::read_csv("src/data.csv", true);
println!("{:?}", data);
}
data.csv
的格式如下:
>>> head src/data.csv
Name,DateTime,Speed
Tom,2016-01-04 09:30:00.038279090,102.44
Tom,2016-01-04 09:30:00.038279090,102.44
这应该可以完成这项工作,注意没有错误处理。这段代码只是为了演示 获取所有csv数据,并将名称字段推送到名称向量中;将datetime字段推入datetime向量,将速度推入速度,然后返回数据帧
extern crate csv;
use std::error::Error;
use csv::StringRecord;
#[derive(Debug)]
struct DataFrame {
header: csv::StringRecord,
name: Vec<String>,
datetime: Vec<String>,
speed: Vec<f32>,
}
impl DataFrame {
fn new() -> DataFrame {
DataFrame {
header: csv::StringRecord::new(),
name: Vec::new(),
datetime: Vec::new(),
speed: Vec::new(),
}
}
fn read_csv(filepath: &str, has_headers: bool) -> DataFrame {
// Open file
let file = std::fs::File::open(filepath).unwrap();
let mut rdr = csv::ReaderBuilder::new()
.has_headers(has_headers)
.from_reader(file);
let mut data_frame = DataFrame::new();
// push all the records
for result in rdr.records().into_iter() {
let record = result.unwrap();
data_frame.push(&record);
}
return data_frame;
}
fn push(&mut self, row: &csv::StringRecord) {
// get name
self.name.push(row[0].to_string());
// get datetime
self.datetime.push(row[1].to_string());
// get speed
self.speed.push(row[2].parse().unwrap());
}
}
fn main() {
let data = DataFrame::read_csv("path to file", true);
println!("{:?}", data)
}
extern板条箱csv;
使用std::error::error;
使用csv::StringRecord;
#[导出(调试)]
结构数据帧{
标题:csv::StringRecord,
姓名:Vec,
日期时间:Vec,
速度:Vec,
}
impl数据帧{
fn new()->DataFrame{
数据帧{
标题:csv::StringRecord::new(),
名称:Vec::new(),
datetime:Vec::new(),
速度:Vec::new(),
}
}
fn read\u csv(文件路径:&str,具有\u头:bool)->DataFrame{
//打开文件
让file=std::fs::file::open(filepath).unwrap();
让mut rdr=csv::ReaderBuilder::new()
.has_头(has_头)
.从_读取器(文件);
让mut data_frame=DataFrame::new();
//推送所有记录
用于将rdr.records()中的结果转换为{
let record=result.unwrap();
数据帧推送(和记录);
}
返回数据帧;
}
fn推送(&mut self,行:&csv::StringRecord){
//得名
self.name.push(行[0].to_string());
//获取日期时间
self.datetime.push(行[1].to_string());
//加速
self.speed.push(行[2].parse().unwrap());
}
}
fn main(){
让data=DataFrame::read_csv(“文件路径”,true);
println!(“{:?}”,数据)
}
push方法中的代码看起来不像是实现目标的非常认真的尝试。你到底被困在哪里?@kazemakase这看起来不像是一次认真的尝试,因为我对锈病没有足够的知识,不知道该往哪个方向走/研究什么课题。不幸的是,尽管尝试实现实际代码并使用它,但仍然是Rust的新手。感谢您缩短了数据。关于push
方法,基本思想似乎很简单:从CSV获取值,push到vector。您似乎了解Vec::push
,但我只能猜测问题在于如何从CSV中获取值。我自己没有用过板条箱,这也没用吗?@kazemakase我确实看了一下StringRecord
是如何被提取到Row
struct中的,但是这个过程看起来像是由#[派生(反序列化)]
执行的黑魔法。我也不知道如何将代码从一个向量结构(如示例中所示)调整为一个向量结构@或者你是说必须先创建一个中间结构,然后将该结构提取到一个向量?有没有办法直接从StringRecord
到向量结构?
extern crate csv;
use std::error::Error;
use csv::StringRecord;
#[derive(Debug)]
struct DataFrame {
header: csv::StringRecord,
name: Vec<String>,
datetime: Vec<String>,
speed: Vec<f32>,
}
impl DataFrame {
fn new() -> DataFrame {
DataFrame {
header: csv::StringRecord::new(),
name: Vec::new(),
datetime: Vec::new(),
speed: Vec::new(),
}
}
fn read_csv(filepath: &str, has_headers: bool) -> DataFrame {
// Open file
let file = std::fs::File::open(filepath).unwrap();
let mut rdr = csv::ReaderBuilder::new()
.has_headers(has_headers)
.from_reader(file);
let mut data_frame = DataFrame::new();
// push all the records
for result in rdr.records().into_iter() {
let record = result.unwrap();
data_frame.push(&record);
}
return data_frame;
}
fn push(&mut self, row: &csv::StringRecord) {
// get name
self.name.push(row[0].to_string());
// get datetime
self.datetime.push(row[1].to_string());
// get speed
self.speed.push(row[2].parse().unwrap());
}
}
fn main() {
let data = DataFrame::read_csv("path to file", true);
println!("{:?}", data)
}