Значения - это, по сути, столбцы в CSV, которые отображаются в одном столбце. Чтобы понять, к какому заголовку относится значение, я просто говорю «можно ли превратить его в число».
Самый простой пример того, что я пытаюсь сделать в Python:
data = ["a","1","2","3","b","4","5","6","c","7","8","9"]
class treatment:
def __init__(self, name):
self.name = name
self.data = []
results = []
for d in data:
try:
int(d)
except ValueError:
results.append(treatment(name=d))
else:
results[-1].data.append(d)
Это то, что у меня есть в Rust, но не работает после разбора:
extern crate csv;
use std::error::Error;
use std::fs::File;
use std::io;
use std::prelude::v1::Option;
use std::process;
use std::vec::Vec;
struct Treatment {
raw_name: String,
channel: String,
data: Vec<i64>,
}
impl Treatment {
fn observe(&mut self, observation: i64) {
&mut self.data.push(observation);
}
}
struct Experiment {
treatments: Vec<Treatment>,
}
impl Experiment {
fn add_treatment(&mut self, treatment_name: &str, channel: &str) {
&mut self.treatments.push(Treatment {
raw_name: treatment_name.to_string(),
channel: channel.to_string(),
data: Vec::new(),
});
}
fn get_current_experiment(&mut self) -> &Treatment {
self.treatments.last().unwrap()
}
}
fn deserialize_csv(file_path: String) -> csv::Reader<File> {
csv::ReaderBuilder::new()
.has_headers(false)
.from_path(file_path)
.expect("Experienced issues reading csv file")
}
fn vectorize_string_records(mut csv_reader: csv::Reader<File>) {
let mut experiments: Experiment = Experiment {
treatments: Vec::new(),
};
for row in csv_reader.records() {
// for these datasets we only care about data in the first cell
let datapoint = match &row {
Ok(T) => T.get(0),
Err(E) => Some(""),
}.unwrap();
let val_as_int = datapoint.parse::<i64>();
let current_treatment = experiments.get_current_experiment();
// discern if value is header or datapoint
match val_as_int {
Ok(int_val) => ¤t_treatment.observe(int_val),
Err(new_header) => &experiments.add_treatment(datapoint, &"ch=1".to_string()),
};
println!("{}", datapoint);
}
}
fn main() {
let i = deserialize_csv("/home/file.csv".to_string());
vectorize_string_records(i);
}
Я борюсь с несколькими концепциями, пытаясь реализовать это в Rust.