irox-csv

Crates.ioirox-csv
lib.rsirox-csv
version0.5.1
sourcesrc
created_at2023-09-05 02:56:32.016495
updated_at2024-04-21 14:59:29.566167
descriptionCSV Reader/Writer
homepagehttps://github.com/spmadden/irox
repositoryhttps://github.com/spmadden/irox
max_upload_size
id963835
size42,432
Sean Madden (spmadden)

documentation

README

IROX CSV Encoder/Decoder

Inspired by Python's csv module, a very basic csv reader & writer.

The primary use-case of this library is interacting with unstructured, variably structured, or dubiously structured data. As such, you probably want the far more robust and far better implemented csv crate.

Goals:

  • Provide a String-based mechanism to read and write CSV files in rfc4180 format.
  • Handle mixed formats resiliently, such as mismatched and newlines within quotes.

Non-Goals:

  • Any interpretation of the contents of the CSV structure itself - everything is an owned String
  • serde support - if you need it, go use the csv crate.

Examples:

  • Straight Iteration:
use irox_csv::error::CSVError;

fn iter_example() -> Result<(), CSVError> {
    let mut input = irox_csv::CSVReader::new(std::io::stdin());
    loop {
        // iterate over each line of the input
        let line : Option<Vec<String>> = input.read_line()?;
        match line {
            Some(fields) => {
                // Use the individual fields of the CSV line
                println!("{:?}", fields); // fields : Vec<String>
            }
            None => {
                // EOF
                break;
            }
        }
    }
    Ok(())
}
  • Map Iteration:
use irox_csv::error::CSVError;

fn map_example() -> Result<(), CSVError> {
    let mut maps = irox_csv::CSVMapReader::new(std::io::stdin());
    loop {
        // iterate over each line of the input
        let maybe_row : Option<Row> = maps.next_row()?;
        match maybe_row {
            Some(row) => {
                // Use the individual fields of the CSV line as a key-value map
                // The keys are the column headers found in the first row, the values are the matching row entry
                let map = row.into_map_lossy();
                println!("{:?}", map); // map : BTree<column:String, rowVal:String>
            }
            None => {
                // EOF
                break;
            }
        }
    }
    Ok(())
}
  • Writing a CSV File using Maps:
fn map_writer_example() -> Result<(), CSVError> {
    let mut buf: Vec<u8> = Vec::new();
    let mut writer = CSVWriterBuilder::new()
        .with_columns(&["first", "second", "third"])
        .build(&mut buf);

    let mut map = BTreeMap::new();
    map.insert("first".to_string(), "firstColFirstRowVal".to_string());
    map.insert("second".to_string(), "secondColFirstRowVal".to_string());
    map.insert("third".to_string(), "thirdColFirstRowVal".to_string());
    writer.write_fields(&map)?;
    
    map.clear();
    map.insert("first".to_string(), "firstColSecondRowVal".to_string());
    map.insert("second".to_string(), "secondColSecondRowVal".to_string());
    map.insert("third".to_string(), "thirdColSecondRowVal".to_string());
    writer.write_fields(&map)?;
    
    Ok(())
}

will result in a buffer:

first,second,third
firstColFirstRowVal,secondColFirstRowVal,thirdColFirstRowVal
firstColSecondRowVal,secondColSecondRowVal,thirdColSecondRowVal
Commit count: 1107

cargo fmt