Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/rust/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Rust 如何将数据从csv::StringRecord推送到结构中的每个列向量?_Rust - Fatal编程技术网

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)
}