A cli toolkit for working with CSV files.
- View - Interactive terminal viewer with keyboard navigation, horizontal scrolling, row selection, copy, and in-viewer filtering
- Count - Count rows and columns
- Move - Reorder rows and columns
- Header - Display and examine CSV headers
- Rename - Rename column headers
- Convert - Convert between CSV and TSV formats
- Lint - Validate CSV files according to RFC 4180
- Filter - Filtering with regex and numeric comparisons
- Select - Extract specific columns
- Sort - Sort data by column values
- Transform - Transform data (uppercase, lowercase, replace, trim)
- Stdin Support - All commands support stdin for easy command chaining
go build -o csvtkAll commands support reading from stdin using - or by omitting the filename.
Open a basic viewer:
csvtk view myfile.csv
# Or simply:
csvtk myfile.csvKeyboard shortcuts:
↑↓/jk: Move up/down one row←→/hl: Scroll left/right through columnsPgUp/PgDn: Navigate by pageg/home: Jump to first rowG/end: Jump to last rowc: Copy selected row to clipboardf: Enter filter mode (search across all columns)r: Reset/clear filterq: Quit
Filter mode:
- Type to search (case-insensitive, searches all columns)
Enter: Apply filterEsc: Cancel filter
Count rows (excluding header):
csvtk count rows myfile.csv
# Or from stdin:
cat myfile.csv | csvtk count rowsCount columns:
csvtk count columns myfile.csvMove a column to a different position (uses an index to specify the new location):
csvtk move column Email 0 myfile.csvMove a row to a different position:
csvtk move row 5 0 myfile.csvDisplay header:
csvtk header myfile.csv
# Or from stdin:
cat myfile.csv | csvtk headerDisplay header with column indices:
csvtk header -n myfile.csvRename a header:
csvtk rename Email EmailAddress myfile.csv -o updated.csvConvert CSV to TSV:
csvtk convert myfile.csv --to-tsvConvert TSV to CSV:
csvtk convert myfile.tsv --to-csvAuto-detect format and convert:
csvtk convert myfile.csv # Automatically converts to TSVValidate CSV file structure:
csvtk lint myfile.csvUse lazy quotes for less strict parsing:
csvtk lint --lazy-quotes myfile.csvcsvtk supports powerful filtering with multiple strategies:
String Filters:
# Exact match (default)
csvtk filter City "New York" data.csv
# Contains
csvtk filter Name "John" data.csv --operator contains
# Starts with
csvtk filter Email "admin" data.csv --operator starts-with
# Ends with
csvtk filter Email ".com" data.csv --operator ends-with
# Not equals
csvtk filter Status "inactive" data.csv --operator not-equalsRegex Filters:
# Regex matching
csvtk filter Email "@(gmail|yahoo)\.com" data.csv --regex
# Using operator flag
csvtk filter Phone "^\d{3}-\d{3}-\d{4}$" data.csv --operator regexNumeric Filters:
# Greater than
csvtk filter Age 30 data.csv --operator ">"
# Less than
csvtk filter Price 100 data.csv --operator "<"
# Greater than or equal
csvtk filter Score 85 data.csv --operator ">="
# Less than or equal
csvtk filter Quantity 50 data.csv --operator "<="
# Numeric equality
csvtk filter Count 10 data.csv --operator "=="
# Numeric not equal
csvtk filter Amount 0 data.csv --operator "!="Output to file:
csvtk filter Age 30 data.csv --operator ">" -o adults.csvFilter from stdin:
cat data.csv | csvtk filter Age 30 - --operator ">" > adults.csvExtract specific columns:
csvtk select "Name,Email,Age" myfile.csvSave to file:
csvtk select "Name,Email" myfile.csv -o output.csvFrom stdin:
cat data.csv | csvtk select "Name,Age" -Sort by column (ascending):
csvtk sort Age myfile.csv -o sorted.csvSort in descending order:
csvtk sort Age myfile.csv -r -o sorted.csvSort to stdout:
csvtk sort Name myfile.csv
# Or from stdin:
cat myfile.csv | csvtk sort City -Uppercase:
# Transform specific column
csvtk transform upper Name data.csv -o output.csv
# Transform all columns
csvtk transform upper --all data.csvLowercase:
csvtk transform lower Email data.csvReplace text:
# Replace in specific column
csvtk transform replace "@example.com" "@newdomain.com" Email data.csv
# Replace in all columns
csvtk transform replace "old" "new" --all data.csv -o output.csvTrim whitespace:
csvtk transform trim Name data.csv
csvtk transform trim --all data.csvTransform with stdin:
cat data.csv | csvtk transform lower Name - > output.csvOne of the most powerful features is the ability to chain commands using stdin/stdout:
# Filter, select columns, and sort in one pipeline
cat data.csv | \
csvtk filter Age 25 - --operator ">" | \
csvtk select "Name,Email,Age" - | \
csvtk sort Age - > result.csv
# Transform, rename, and output
csvtk transform lower Email data.csv | \
csvtk rename Email EmailAddress - | \
csvtk transform replace "@example.com" "@newdomain.com" EmailAddress - \
> transformed.csv
# Count filtered results
csvtk filter City "New York" data.csv | \
csvtk count rows
# Complex filtering with multiple conditions (using shell)
csvtk filter Age 30 data.csv --operator ">" | \
csvtk filter City "New York" - | \
csvtk select "Name,Age" - | \
csvtk sort Age - -rMost commands support these flags:
-d, --delimiter: Specify field delimiter (default:,)- Use
\tor\\tfor tab-delimited files
- Use
-o, --output: Specify output file (defaults to stdout for most commands)
The filter command supports the following operators via the --operator flag:
String operators:
equalsoreq- Exact string match (default)contains- Substring matchstarts-withorstartswith- Prefix matchends-withorendswith- Suffix matchnot-equalsorne- String inequalityregexorregexp- Regular expression match
Numeric operators:
>orgt- Greater than<orlt- Less than>=orgte- Greater than or equal<=orlte- Less than or equal==- Numeric equality!=- Numeric inequality
See LICENSE file for details.
Contributions are welcome! Please feel free to submit issues or pull requests.