This crate provides a streaming CSV (comma separated values) writer and
reader that works with the serialize
crate to do type based encoding
and decoding. There are two primary goals of this project:
Licensed under the UNLICENSE.
The API is fully documented with lots of examples: http://burntsushi.net/rustdoc/csv/.
Here is a full working Rust program that decodes records from a CSV file. Each record consists of two strings and an integer (the edit distance between the strings):
```rust extern crate csv;
use std::path::Path;
fn main() { let fp = &Path::new("./data/simple.csv"); let mut rdr = csv::Reader::from_file(fp);
for record in rdr.decode() {
let (s1, s2, dist): (String, String, uint) = record.unwrap();
println!("({}, {}): {}", s1, s2, dist);
}
} ```
Don't like tuples? That's fine. Use a struct instead:
```rust extern crate csv; extern crate serialize;
use std::path::Path;
struct Record { s1: String, s2: String, dist: uint, }
fn main() { let fp = &Path::new("./data/simple.csv"); let mut rdr = csv::Reader::from_file(fp);
for record in rdr.decode() {
let record: Record = record.unwrap();
println!("({}, {}): {}", record.s1, record.s2, record.dist);
}
} ```
Do some records not have a distance for some reason? Use an Option
type!
```rust
struct Record {
s1: String,
s2: String,
dist: Option
You can also read CSV headers, change the delimiter, use enum
types or just
get plain access to records as vectors of strings. There are examples with more
details in the documentation.
This crate works with Cargo and is on
crates.io. The package is regularly updated.
Add is to your Cargo.toml
like so:
```toml [dependencies] csv = "*"
```
There are some rough benchmarks (compared with Go) here: https://github.com/BurntSushi/rust-csv/tree/master/bench