This is a CSV (delimiter can be changed) parser & writer with a focus on: 1. Simplicity 2. Robustness 3. Performance (to a lesser extent)
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:
1,2,3,
is parsed as ["1","2","3",""]
1,2",3
is parsed as ["1","2\"","3"]
1,2,"3"123
is parsed as ["1","2","3123"]
1,2,"3*EOF*
is parsed as ["1","2","3"]
[""]
String::from_utf8_lossy
function.\r
in unquoted fields is always discarded.The writer always produces RFC 4180 compliant output and can write to any object that implements the std::io::Writer
trait.
Add to your Cargo.toml:
[dependencies]
simple_csv = "~0.0.8"
```rust let teststring = "1,2,3\r\n4,5,6".tostring(); let bytes = teststring.intobytes(); let testcsvreader = &*bytes;
let mut reader = SimpleCsvReader::new(testcsvreader);
asserteq!(reader.nextrow(), Ok(&vec!["1".to_string(),"2".to_string(),"3".to_string()])); assert_eq!(reader.next_row(), Ok(&vec!["4".tostring(),"5".tostring(),"6".tostring()])); assert!(reader.nextrow().is_err()); ```
```rust let teststring = "1|2|3\r\n4|5|6".tostring(); let bytes = teststring.intobytes(); let testcsvreader = &*bytes; let mut csvoptions: SimpleCsvReaderOptions = Default::default(); csvoptions.delimiter = '|'; let mut reader = SimpleCsvReader::withoptions(testcsvreader,csvoptions);
asserteq!(reader.nextrow(), Ok(&vec!["1".to_string(),"2".to_string(),"3".to_string()])); assert_eq!(reader.next_row(), Ok(&vec!["4".tostring(),"5".tostring(),"6".tostring()])); assert!(reader.nextrow().is_err()); ```
```rust let teststring = "1,2,3\r\n4,5,6".tostring(); let bytes = teststring.intobytes(); let testcsvreader = &*bytes;
let mut reader = SimpleCsvReader::new(testcsvreader);
for row in reader { println!("{}",row); } ```
```rust let teststring = "1,#2#,3\r\n#4#,5,6".tostring(); let bytes = teststring.intobytes(); let testcsvreader = &*bytes; let mut csvoptions: SimpleCsvReaderOptions = Default::default(); csvoptions.textenclosure = '#'; let mut reader = SimpleCsvReader::withoptions(testcsvreader,csv_options);
asserteq!(reader.nextrow(), Ok(&vec!["1".to_string(),"2".to_string(),"3".to_string()])); assert_eq!(reader.next_row(), Ok(&vec!["4".tostring(),"5".tostring(),"6".tostring()])); assert!(reader.nextrow().is_err()); ```
```rust let mut vec = Vec::new(); let mut writer = SimpleCsvWriter::new(vec); let _ = writer.writeall(&vec![ vec!["1".tostring(),"2".tostring(),"3".tostring()], vec!["4".tostring(),"5".tostring(),"6".tostring()]]); vec = writer.asinner();
let teststring = "1,2,3\n4,5,6"; asserteq!(vec, teststring.asbytes()); ```