Skip to content

Commit

Permalink
add alternate delimiter (#13)
Browse files Browse the repository at this point in the history
* add alternate delimiter

* fix test
  • Loading branch information
hderms authored Apr 28, 2021
1 parent b2b326b commit 757b2e8
Show file tree
Hide file tree
Showing 5 changed files with 30 additions and 6 deletions.
6 changes: 4 additions & 2 deletions src/csv/csv_data.rs
Original file line number Diff line number Diff line change
Expand Up @@ -28,11 +28,12 @@ pub struct CsvData {
}
impl CsvData {
///Load CSVData from a filename
pub fn from_filename(filename: &str) -> Result<CsvData, Box<dyn Error>> {
pub fn from_filename(filename: &str, delimiter: char) -> Result<CsvData, Box<dyn Error>> {
debug!("Trying to load CSV from filename {}", filename);
let mut records = Vec::with_capacity(10000);
let mut rdr = csv::ReaderBuilder::new()
.buffer_capacity(16 * (1 << 10))
.delimiter(delimiter as u8)
.from_path(filename)?;

for result in rdr.records() {
Expand All @@ -52,9 +53,10 @@ impl CsvData {
#[cfg(test)]
mod tests {
use super::*;
const delimiter: char = ',';
#[test]
fn it_can_load_file() {
let csv = CsvData::from_filename("testdata/test.csv").unwrap();
let csv = CsvData::from_filename("testdata/test.csv", delimiter).unwrap();
assert_eq!(csv.records, vec!(StringRecord::from(vec!("bar", "13"))))
}
}
8 changes: 7 additions & 1 deletion src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -7,18 +7,24 @@ use crate::qsv::{execute_query, write_to_stdout};
use std::error::Error;
use simple_logger::SimpleLogger;
use clap::{AppSettings, Clap};
use crate::qsv::Options;

#[derive(Clap)]
#[clap(version = "0.1", author = "Dermot H. <[email protected]>")]
#[clap(setting = AppSettings::ColoredHelp)]
struct Opts {
query: String,
#[clap(short, long, default_value=",")]
delimiter: char
}

fn main() -> Result<(), Box<dyn Error>> {
SimpleLogger::from_env().init()?;
let opts: Opts = Opts::parse();
let query = opts.query;
let results = execute_query(query.as_str())?;
let delimiter = opts.delimiter;
let options = Options{delimiter};
let results = execute_query(query.as_str(), &options)?;
write_to_stdout(results)?;
Ok(())
}
10 changes: 7 additions & 3 deletions src/qsv.rs
Original file line number Diff line number Diff line change
Expand Up @@ -14,9 +14,12 @@ use uuid::Uuid;
use log::debug;

type Rows = Vec<Vec<String>>;
pub struct Options {
pub delimiter: char
}

///Executes a query, possibly returning Rows
pub fn execute_query(query: &str) -> Result<Rows, Box<dyn Error>> {
pub fn execute_query(query: &str, options: &Options) -> Result<Rows, Box<dyn Error>> {
let mut collector = Collector::new();

let ast = Parser::parse_sql(query)?;
Expand All @@ -26,7 +29,7 @@ pub fn execute_query(query: &str) -> Result<Rows, Box<dyn Error>> {
collector.collect(statement); //TODO: should we handle multiple SQL statements later?
let mut files_to_tables = HashMap::new();
for filename in collector.table_identifiers.iter() {
if let Ok(()) = maybe_load_file(&mut files_to_tables, filename, &mut db) {
if let Ok(()) = maybe_load_file(&mut files_to_tables, filename, &mut db, options) {
debug!("Potential filename from SQL was able to be loaded: {}", filename);
} else {
debug!("Identifier in SQL could not be loaded as file: {}", filename);
Expand All @@ -42,8 +45,9 @@ fn maybe_load_file(
files_to_tables: &mut HashMap<String, String>,
filename: &str,
db: &mut Db,
options: &Options
) -> Result<(), Box<dyn Error>> {
let csv = CsvData::from_filename(filename)?;
let csv = CsvData::from_filename(filename, options.delimiter)?;
let path = Path::new(filename);
debug!("Attempting to load identifier from SQL as file: {}", filename);
let table_name = path.file_stem(); //TODO: should we canonicalize path?
Expand Down
3 changes: 3 additions & 0 deletions testdata/slash_as_separator.csv
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
occupation/minimum_age
Bartender/32
Construction Worker/25
9 changes: 9 additions & 0 deletions tests/integration.rs
Original file line number Diff line number Diff line change
Expand Up @@ -84,3 +84,12 @@ fn it_will_run_a_simple_query_with_stddev() -> Result<(), Box<dyn std::error::Er
cmd.assert().success().stdout(predicates::str::contains("1.7078251276599"));
Ok(())
}

#[test]
fn it_will_run_with_an_alternate_delimiter() -> Result<(), Box<dyn std::error::Error>> {
let mut cmd = Command::cargo_bin("qsv")?;
cmd.arg("select min(minimum_age) from testdata/slash_as_separator.csv");
cmd.arg("--delimiter=/");
cmd.assert().success().stdout(predicates::str::contains("25"));
Ok(())
}

0 comments on commit 757b2e8

Please sign in to comment.