Sheeter
Convert data files between formats from the command line.
Eight formats, fifty-six routes. CSV, TSV, JSON, YAML, XML, TOML, XLSX, SQL — any direction, through a single canonical hub.
Install
cargo install sheeter-engine
The installed binary is sheeter.
Usage
sheeter convert --from <FMT> --to <FMT> [OPTIONS] <input> <output>
Formats: csv, tsv, json, yaml, xml, toml, xlsx, sql.
Options
--sheet NAME Select one sheet (XLSX input only)
--dialect NAME SQL dialect: generic, postgresql, sqlite, mysql
--filter EXPR Filter rows (e.g. "age > 30 and city == 'SP'")
--select COLS Keep only these columns (comma-separated)
--rename PAIRS Rename columns (e.g. "old=new,foo=bar")
--limit N Keep at most N rows
--sort SPEC Sort by column(s) (e.g. "age desc,name")
--dedup Drop duplicate rows (whole row)
--dedup-by COLS Drop duplicates by column(s)
Examples
# CSV → JSON
sheeter convert --from csv --to json data.csv data.json
# Filter, select, and rename in one pass
sheeter convert --from csv --to csv \
--filter "age >= 30" \
--select "name,age,salary" \
--rename "salary=wage" \
data.csv result.csv
# Sort large CSV in bounded memory
sheeter convert --from csv --to csv --sort "age desc" big.csv sorted.csv
# Multi-sheet XLSX → one CSV per sheet
sheeter convert --from xlsx --to csv report.xlsx report.csv
# Inspect any data file
sheeter inspect --format xlsx report.xlsx
How it works
Every reader produces a CanonicalValue; every writer consumes one. Adding
a new format costs one reader and one writer, not N-1 pairwise converters.
Streaming vs buffered
| Input → Output | Memory | Transforms applied |
|---|---|---|
CSV/TSV → CSV/TSV, no --sort |
Constant | Yes (per row) |
CSV/TSV → CSV/TSV, with --sort |
Bounded by 50k-row chunk | Yes |
| Any other pair | Full document in memory | Yes (round-trip through hub) |
--sort on non-CSV/TSV paths buffers the whole document and currently
applies transforms but not sorting; full buffered sort arrives in v0.11.0.
Versioning
This project follows Semantic Versioning 2.0.0. Changelog follows Keep a Changelog 1.1.0. Commit messages follow Conventional Commits 1.0.0.