| name | xsv |
| description | Use xsv for fast CSV data processing with selection, filtering, statistics, joining, sorting, and indexing for high-performance data manipulation. |
xsv - CSV Command Line Toolkit Skill
You are a CSV data manipulation specialist using xsv, a fast command-line CSV toolkit written in Rust. This skill provides comprehensive guidance for processing, analyzing, and transforming CSV data efficiently.
Why xsv?
xsv is designed for high-performance CSV operations:
- Extremely fast: Rust-based, optimized for speed
- Low memory: Streaming operations when possible
- Rich features: 20+ commands for CSV manipulation
- Indexing: Create indexes for faster random access
- Composable: Unix philosophy - pipe commands together
Core Capabilities
- Selection: select, headers, slice, sample
- Searching: search, frequency
- Analysis: stats, frequency, count
- Transformation: fmt, fixlengths, flatten
- Combination: join, cat
- Sorting: sort
- Display: table
- Splitting: split
- Performance: index
Quick Start
View CSV Data as Table
xsv table data.csv
xsv table data.csv | less -S
xsv table -c 20 data.csv
Count Rows
xsv count data.csv
View Headers
xsv headers data.csv
Select Columns
xsv select 1,3,5 data.csv
xsv select Name,Email,Age data.csv
Essential Commands
headers - View Column Names
xsv headers data.csv
Use case: Understand CSV structure before operations
count - Count Records
xsv count data.csv
xsv count data.csv.idx
Performance: O(1) with index, O(n) without
select - Select Columns
xsv select 1,3,5 data.csv
xsv select Name,Email,Age data.csv
xsv select 1-4 data.csv
xsv select Name-Age data.csv
xsv select 3- data.csv
xsv select '!1-2' data.csv
xsv select 3,1,2,1 data.csv
xsv select 'Name[0],Name[1],Name[2]' data.csv
xsv select '"Date - Opening","Date - Closing"' data.csv
Common options:
-o, --output <file>: Write to file
-n, --no-headers: Treat first row as data
-d, --delimiter <char>: Input delimiter (default: ,)
search - Filter Rows by Regex
xsv search "pattern" data.csv
xsv search -i "pattern" data.csv
xsv search -s Email "gmail.com" data.csv
xsv search -s 1,3,5 "pattern" data.csv
xsv search -v "pattern" data.csv
xsv search "active" data.csv -o active_users.csv
Use case: Filter CSV rows like grep
slice - Extract Row Ranges
xsv slice -l 10 data.csv
xsv slice -s 100 -e 200 data.csv
xsv slice -s 50 -l 20 data.csv
xsv count data.csv
xsv slice -s -10 data.csv
xsv slice -i 42 data.csv
Performance: Much faster with index
stats - Compute Statistics
xsv stats data.csv
xsv stats --everything data.csv
xsv stats -s Age,Salary data.csv
xsv stats --median data.csv
xsv stats --mode data.csv
xsv stats --cardinality data.csv
xsv stats -j 4 data.csv
xsv stats data.csv | xsv table
Output fields: field, type, sum, min, max, mean, stddev, median, mode, cardinality
frequency - Frequency Tables
xsv frequency data.csv
xsv frequency -s Status,Category data.csv
xsv frequency -l 20 data.csv
xsv frequency -l 0 data.csv
xsv frequency --asc data.csv
xsv frequency --no-nulls data.csv
xsv frequency -s Status data.csv | xsv table
Output: field, value, count
Use case: Value distribution analysis
sort - Sort Records
xsv sort data.csv
xsv sort -s Age data.csv
xsv sort -s LastName,FirstName data.csv
xsv sort -s Age -N data.csv
xsv sort -s Age -R data.csv
xsv sort -s Salary -N -R data.csv
xsv sort -s Name data.csv -o sorted.csv
Note: Requires reading entire file into memory
join - Join Two CSV Files
xsv join ID users.csv ID orders.csv
xsv join --left ID users.csv ID orders.csv
xsv join --right ID users.csv ID orders.csv
xsv join --full ID users.csv ID orders.csv
xsv join --no-case Email users.csv Email contacts.csv
xsv join 'ID,Date' file1.csv 'ID,Date' file2.csv
xsv join --nulls ID file1.csv ID file2.csv
xsv join --cross 1 file1.csv 1 file2.csv
xsv join ID users.csv ID orders.csv -o joined.csv
Join types:
- Default: Inner join (intersection)
--left: Left outer join
--right: Right outer join
--full: Full outer join
--cross: Cartesian product (use with caution)
table - Format as Aligned Table
xsv table data.csv
xsv table data.csv | less -S
xsv table -w 10 data.csv
xsv table -p 4 data.csv
xsv table -c 20 data.csv
xsv slice -l 50 data.csv | xsv table -c 30
Note: Requires buffering entire file into memory
sample - Random Sampling
xsv sample 100 data.csv
xsv count data.csv
xsv sample 100000 data.csv
xsv sample 1000 large.csv -o sample.csv
xsv sample 10000 huge.csv | xsv stats --everything
Performance: Uses indexing for samples <10% of total
fmt - Format Output
xsv fmt -t '\t' data.csv -o data.tsv
xsv fmt -t '|' data.csv
xsv fmt --crlf data.csv -o windows.csv
xsv fmt --quote-always data.csv
xsv fmt --quote "'" data.csv
xsv fmt --escape '\\' data.csv
cat - Concatenate Files
xsv cat rows file1.csv file2.csv file3.csv
xsv cat columns file1.csv file2.csv
xsv cat rows-columns file1.csv file2.csv
split - Split Into Multiple Files
xsv split -s 1000 output_dir data.csv
flatten - Show One Field Per Line
xsv slice -i 0 data.csv | xsv flatten
fixlengths - Fix Inconsistent Row Lengths
xsv fixlengths data.csv -o fixed.csv
index - Create Index for Performance
xsv index data.csv
xsv count data.csv
xsv slice -i 1000 data.csv
xsv sample 100 data.csv
When to index:
- Large files (>100MB)
- Multiple operations on same file
- Random access patterns (slice, sample)
- Statistics with parallel processing
Common Workflows
Workflow 1: Data Exploration
xsv headers data.csv
xsv count data.csv
xsv slice -l 10 data.csv | xsv table
xsv stats data.csv | xsv table
xsv frequency -s Status data.csv | xsv table
Workflow 2: Data Filtering and Selection
xsv select Name,Email,Age,Status data.csv |
xsv search -s Status "active" |
xsv search -s Age "^[3-9][0-9]$" |
xsv -o active_users_30plus.csv
Workflow 3: Data Analysis Pipeline
xsv index large_data.csv
xsv sample 10000 large_data.csv |
xsv select Revenue,Region,Product |
xsv stats --everything |
xsv table
Workflow 4: Data Joining
xsv join UserID users.csv UserID orders.csv |
xsv select 'UserName,Email,OrderID,OrderDate,Amount' |
xsv sort -s Amount -N -R |
xsv slice -l 100 |
xsv table -o top_orders.txt
Workflow 5: Data Cleaning
xsv fixlengths messy.csv |
xsv select 1-10 |
xsv search -s Email '.+' |
xsv sort -s Email |
uniq |
xsv -o cleaned.csv
Workflow 6: Data Transformation
xsv select 'LastName,FirstName,Email,Phone' data.csv |
xsv fmt -t '\t' |
xsv -o output.tsv
Workflow 7: Large File Processing
xsv index huge_file.csv
xsv count huge_file.csv
xsv sample 50000 huge_file.csv |
xsv stats --everything |
xsv table
Performance Tips
1. Create Indexes for Large Files
xsv index large.csv
Speeds up:
count (O(1) instead of O(n))
slice (direct access)
sample (efficient random access)
stats -j (parallel processing)
2. Use Streaming Operations
These don't require reading entire file into memory:
select
search
slice (with index)
headers
count (with index)
3. Avoid Memory-Intensive Operations on Large Files
These require full file in memory:
sort
table
stats --median
stats --mode
frequency
Solution: Use sample or slice first:
xsv sample 100000 huge.csv | xsv stats --everything
4. Parallel Processing
xsv stats -j 0 data.csv
xsv stats -j 4 data.csv
Requires: Indexed file for best performance
5. Chain Commands Efficiently
xsv select Name,Age data.csv | xsv search -s Age "^[3-9]" | xsv table
xsv select Name,Age data.csv -o temp1.csv
xsv search -s Age "^[3-9]" temp1.csv -o temp2.csv
xsv table temp2.csv
Advanced Patterns
Pattern 1: Top N Analysis
xsv sort -s Revenue -N -R customers.csv | xsv slice -l 10 | xsv table
Pattern 2: Conditional Aggregation
xsv frequency -s Status -l 0 data.csv | xsv table
xsv select Region,Age data.csv | xsv sort -s Region | ...
Pattern 3: Multi-Column Search
xsv select Name,Email,Phone data.csv | xsv search "pattern"
Pattern 4: Data Validation
xsv search -s Email -v '.+' data.csv
xsv select Email data.csv | xsv sort | uniq -d
Pattern 5: Data Comparison
xsv select ID,Value file1.csv > temp1
xsv select ID,Value file2.csv > temp2
diff temp1 temp2
Pattern 6: Column Statistics
xsv select Age data.csv | xsv stats | xsv table
xsv select Age,Salary,Score data.csv | xsv stats --everything | xsv table
Common Options
Most commands support these options:
-h, --help Display help
-o, --output <file> Write to file instead of stdout
-n, --no-headers First row is data, not headers
-d, --delimiter <char> Input delimiter (default: ,)
Delimiter Support
Reading Different Formats
xsv select 1,3 -d '\t' data.tsv
xsv select Name,Age -d '|' data.txt
xsv select 1-5 -d ';' data.csv
Converting Formats
xsv fmt -d '\t' data.tsv -o data.csv
xsv fmt -t '\t' data.csv -o data.tsv
xsv fmt -t '|' data.csv -o data.txt
Error Handling
Common Issues
Issue: "CSV error: record has different length"
Solution: Use fixlengths
xsv fixlengths data.csv -o fixed.csv
Issue: "No such file or directory"
Solution: Check file path, use absolute paths if needed
Issue: Out of memory with large file
Solution: Use sampling or indexing
xsv index large.csv
xsv sample 10000 large.csv | xsv stats
Issue: Column name not found
Solution: Check headers first
xsv headers data.csv
Integration with Other Tools
With jq (for CSV→JSON)
xsv select Name,Age data.csv | xsv fmt -t ',' | \
python -c 'import csv, json, sys; print(json.dumps([dict(r) for r in csv.DictReader(sys.stdin)]))'
With awk
xsv select Price,Quantity data.csv | \
awk -F, 'NR==1{print $0",Total"} NR>1{print $0","$1*$2}'
With sort/uniq
xsv select Email data.csv | sort | uniq
With grep
cat data.csv | grep "pattern" | xsv table
Quick Reference
xsv headers data.csv
xsv count data.csv
xsv slice -l 5 data.csv | xsv table
xsv select 1,3,5 data.csv
xsv select Name,Email data.csv
xsv search "pattern" data.csv
xsv search -s Email "gmail" data.csv
xsv stats data.csv
xsv frequency -s Status data.csv
xsv sort -s Age -N data.csv
xsv join ID file1.csv ID file2.csv
xsv table data.csv
xsv fmt -t '\t' data.csv
xsv sample 1000 data.csv
xsv index large.csv
Comparison with xlsx
While xlsx handles Excel files, xsv is specialized for CSV:
| Feature | xsv | xlsx |
|---|
| Format | CSV only | XLSX/Excel |
| Speed | Extremely fast | Fast |
| Memory | Streaming | Depends on operation |
| Formulas | No | Yes |
| Formatting | No | Yes |
| Multiple sheets | No | Yes |
| Statistics | Rich | Basic |
| Joining | Yes | No |
| Indexing | Yes | No |
When to use xsv:
- Working with CSV data
- Need maximum performance
- Large file processing
- Statistical analysis
- Data pipelines
When to use xlsx:
- Excel file format required
- Need formulas and formatting
- Multiple sheets
- Cell-level operations
Summary
Primary tool: xsv for fast CSV processing
Most common commands:
xsv headers - Understand structure
xsv select - Choose columns
xsv search - Filter rows
xsv stats - Analyze data
xsv table - View formatted
xsv join - Combine files
xsv index - Speed up operations
Key advantages:
- Blazing fast (Rust-based)
- Composable (Unix pipes)
- Low memory (streaming)
- Rich analysis features
- Index support for large files
Best practices:
- Index large files first
- Use sampling for quick exploration
- Chain commands with pipes
- Check headers before operations
- Use appropriate output formats