Simple CSV Library
This is a CSV (delimiter can be changed) parser & writer with a focus on:
- Simplicity
- Robustness
- Performance (to a lesser extent)
Parser
The parser follows RFC 4180, but allows for non-conformant files to be processed.
In order to achieve this robustness, the parser makes the following assumptions:
- Commas on the end of a line results in a empty string for that column.
*
1,2,3,
is parsed as["1","2","3",""]
- Double quotes in a field that is not enclosed in double quotes are processed as a regular character and are included in the column string.
*
1,2",3
is parsed as["1","2\"","3"]
- Non-delimiter characters immediately following a quoted field are treated as part of the column data and are appended to the column string.
*
1,2,"3"123
is parsed as["1","2","3123"]
- An EOF in the middle of a quoted field is parsed as if the field was properly closed.
*
1,2,"3*EOF*
is parsed as["1","2","3"]
- There is no error for empty lines or varying number of columns per line.
* An empty line is parsed as
[""]
- Lines are assumed to be UTF8 and are decoded "lossily" via Rust's
String::from_utf8_lossy
function. - The return character
\r
in unquoted fields is always discarded.
Writer
The writer always produces RFC 4180 compliant output and can write to any object that implements the std::io::Writer
trait.
Usage
Add to your Cargo.toml:
[dependencies]
simple_csv = "~0.0.8"
Simple CSV Parsing usage
let test_string = "1,2,3\r\n4,5,6".to_string;
let bytes = test_string.into_bytes;
let test_csv_reader = &*bytes;
let mut reader = new;
assert_eq!;
assert_eq!;
assert!;
Different Delimiter
let test_string = "1|2|3\r\n4|5|6".to_string;
let bytes = test_string.into_bytes;
let test_csv_reader = &*bytes;
let mut csv_options: SimpleCsvReaderOptions = Default default;
csv_options.delimiter = '|';
let mut reader = with_options;
assert_eq!;
assert_eq!;
assert!;
Using a iterator
let test_string = "1,2,3\r\n4,5,6".to_string;
let bytes = test_string.into_bytes;
let test_csv_reader = &*bytes;
let mut reader = new;
for row in reader
Different Text Enclosing Character
let test_string = "1,#2#,3\r\n#4#,5,6".to_string;
let bytes = test_string.into_bytes;
let test_csv_reader = &*bytes;
let mut csv_options: SimpleCsvReaderOptions = Default default;
csv_options.text_enclosure = '#';
let mut reader = with_options;
assert_eq!;
assert_eq!;
assert!;
Simple CSV Writing Usage
let mut vec = Vec new;
let mut writer = new;
let _ = writer.write_all;
vec = writer.as_inner;
let test_string = "1,2,3\n4,5,6";
assert_eq!;
To Do
- Allow the iterator method to return errors