use std::io;
use std::io::prelude::*;
use std::io::{BufReader, Error, ErrorKind};
use std::fs::File;
use datatable::*;
pub struct Loader<'a> {
pub has_header: bool,
file: &'a str,
pub delimiter: char,
}
impl<'a> Loader<'a> {
pub fn new(has_header: bool, file: &str, delimiter: char) -> Loader {
Loader {
has_header: has_header,
file: file,
delimiter: delimiter,
}
}
pub fn load_file(self) -> Result<DataTable, io::Error> {
let f = try!(File::open(self.file));
let reader = BufReader::new(f);
let mut table = DataTable::empty();
let mut lines = reader.lines();
if self.has_header {
if let Some(line) = lines.next() {
let line = try!(line);
let values = line.split(self.delimiter);
for val in values {
let mut column = DataColumn::empty();
column.name = Some(val.to_owned());
table.data_cols.push(column);
}
}
}
else {
if let Some(line) = lines.next() {
let line = try!(line);
let values = line.split(self.delimiter);
for val in values {
let mut column = DataColumn::empty();
column.push(val);
table.data_cols.push(column);
}
}
}
for line in lines {
let line = try!(line);
let values = line.split(self.delimiter);
let mut idx = 0usize;
for (i, val) in values.enumerate() {
idx = i;
if idx > table.cols() {
return Err(Error::new(ErrorKind::InvalidInput, "Malformed data format."));
}
table.data_cols[idx].push(val);
}
if idx != table.cols()-1 {
return Err(Error::new(ErrorKind::InvalidInput, "Malformed data format."));
}
}
table.shrink_to_fit();
Ok(table)
}
}
pub fn load_file(file: &str) -> DataTable {
let loader = Loader {
has_header: false,
file: file,
delimiter: ',',
};
loader.load_file().unwrap()
}