Как передать данные из csv :: StringRecord в каждый вектор столбца в структуре? - PullRequest
0 голосов
/ 09 мая 2018

Как реализовать черту push(&self, row: &csv::StringRecord) ниже?

Входные данные являются ссылкой на csv::StringRecord из библиотеки rust-csv. Идея состоит в том, чтобы добавить каждый столбец к его вектору.

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

Cargo.toml имеет следующую зависимость (версия важна, так как ReaderBuilder доступна только после версии 1.

[dependencies]
csv = "1.0.0-beta.5"

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

1 Ответ

0 голосов
/ 09 мая 2018

Это должно сделать работу, обратите внимание, что обработка ошибок не выполняется, этот код только для демонстрационных целей.

Возьмите все данные CSV и вставьте поля имени в вектор имени; вставьте поля datetime в вектор datetime и увеличьте скорость, затем верните DataFrame.

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)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...