use excelstream::CsvReader;
use std::error::Error;
fn main() -> Result<(), Box<dyn Error>> {
println!("=== CSV Reader Examples ===\n");
println!("1. Reading plain CSV...");
{
let mut reader = CsvReader::open("examples/output.csv")?;
println!(" First 5 rows:");
for (i, row_result) in reader.rows().enumerate() {
let row = row_result?;
if i < 5 {
println!(" Row {}: {:?}", i + 1, row);
}
}
println!(" Total rows read: {}", reader.row_count());
}
println!("\n2. Reading with headers...");
{
let mut reader = CsvReader::open("examples/typed.csv")?.has_header(true);
let first_row_result = reader.rows().next();
if first_row_result.is_some() {
if let Some(headers) = reader.headers() {
println!(" Headers: {:?}", headers);
}
}
println!(" Data rows:");
for row_result in reader.rows() {
let row = row_result?;
println!(" {:?}", row);
}
}
println!("\n3. Reading Zstd compressed CSV (100K rows)...");
{
let mut reader = CsvReader::open("examples/large.csv.zst")?;
let mut count = 0;
for row_result in reader.rows() {
let _row = row_result?;
count += 1;
if count % 20_000 == 0 {
println!(" Read {} rows...", count);
}
}
println!(" Total rows: {}", count);
}
println!("\n4. Reading Deflate/Gzip compressed CSV...");
{
let mut reader = CsvReader::open("examples/data.csv.gz")?;
println!(" Contents:");
for row_result in reader.rows() {
let row = row_result?;
println!(" {:?}", row);
}
println!(" Total rows: {}", reader.row_count());
}
println!("\n5. Reading edge cases (quotes, commas, newlines)...");
{
let mut reader = CsvReader::open("examples/edge_cases.csv")?;
println!(" Special characters handled:");
for (i, row_result) in reader.rows().enumerate() {
let row = row_result?;
if i == 0 {
println!(" Header: {:?}", row);
} else if row.len() >= 2 {
println!(" Row {}: Field={}, Value={}", i, row[0], row[1]);
} else {
println!(" Row {}: {:?}", i, row);
}
}
}
println!("\n6. Reading with custom delimiter (semicolon)...");
{
let mut reader = CsvReader::open("examples/semicolon.csv")?.delimiter(b';');
println!(" Countries:");
for row_result in reader.rows() {
let row = row_result?;
println!(" {:?}", row);
}
}
println!("\n7. Reading specific columns...");
{
let mut reader = CsvReader::open("examples/output.csv")?.has_header(true);
if let Some(headers) = reader.headers() {
println!(" Available columns: {:?}", headers);
}
println!(" Name and City only:");
for row_result in reader.rows() {
let row = row_result?;
if row.len() >= 3 {
println!(" {} lives in {}", row[0], row[2]);
}
}
}
println!("\n8. Manual row reading (read_row)...");
{
let mut reader = CsvReader::open("examples/batch.csv")?;
println!(" Reading row by row:");
while let Some(row) = reader.read_row()? {
println!(" {:?}", row);
}
println!(" Total rows read: {}", reader.row_count());
}
println!("\n9. Error handling example...");
{
match CsvReader::open("examples/nonexistent.csv") {
Ok(_) => println!(" File opened"),
Err(e) => println!(" Expected error: {}", e),
}
}
println!("\n10. Counting rows in large file...");
{
let mut reader = CsvReader::open("examples/large.csv.zst")?;
let count = reader.rows().filter_map(|r| r.ok()).count();
println!(" Total rows in large.csv.zst: {}", count);
}
println!("\n=== All examples completed successfully! ===");
Ok(())
}