Skip to content

LouLouLibs/dt-cli-tools

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

25 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

dt-cli-tools

View, filter, and diff tabular data files from the command line

Vibecoded License: MIT

dt-cli-tools demo

dtcat · dtfilter · dtdiff · Install · Claude Code


Three read-only binaries, no runtime dependencies. Supports CSV, TSV, Parquet, Arrow/Feather, JSON, NDJSON, and Excel.

# View a file
dtcat data.parquet

# Filter rows
dtfilter data.csv --filter "Amount>1000" --sort "Amount:desc"

# Diff two files
dtdiff old.csv new.csv --key ID

Supersedes xl-cli-tools — same filtering and diff capabilities, now for all tabular formats.

Supported Formats

Format Extensions Detection
CSV .csv delimiter heuristic
TSV .tsv, .tab delimiter heuristic
Parquet .parquet, .pq PAR1 magic
Arrow/Feather .arrow, .feather, .ipc ARROW1 magic
JSON .json [ prefix
NDJSON .ndjson, .jsonl { prefix
Excel .xlsx, .xls, .xlsb, .ods ZIP/OLE magic

Format detection: --format flag > magic bytes > file extension. CSV delimiter auto-detected (comma, tab, semicolon).

Installation

Pre-built binaries (macOS)

Download from Releases:

# Apple Silicon (macOS)
for tool in dtcat dtfilter dtdiff; do
  curl -L "https://github.com/LouLouLibs/dt-cli-tools/releases/latest/download/${tool}-aarch64-apple-darwin" \
    -o ~/.local/bin/$tool
done
chmod +x ~/.local/bin/dt{cat,filter,diff}

# Intel Mac (macOS)
for tool in dtcat dtfilter dtdiff; do
  curl -L "https://github.com/LouLouLibs/dt-cli-tools/releases/latest/download/${tool}-x86_64-apple-darwin" \
    -o ~/.local/bin/$tool
done
chmod +x ~/.local/bin/dt{cat,filter,diff}

From source

cargo install --path .

Requires Rust 1.85+.

dtcat — View Data Files

dtcat demo

# Overview: schema + data (<=50 rows all, >50 head/tail 25)
dtcat data.parquet

# Column names and types only
dtcat data.csv --schema

# Summary statistics (count, mean, std, min, max, median)
dtcat data.csv --describe

# File metadata (size, format, sheets)
dtcat report.xlsx --info

# Pick a sheet in a multi-sheet workbook
dtcat report.xlsx --sheet Revenue

# First 10 rows / last 5 rows
dtcat data.csv --head 10
dtcat data.csv --tail 5

# CSV output for piping
dtcat data.parquet --csv

# Random sample of rows
dtcat huge.parquet --sample 20
dtcat huge.parquet --sample 50 --csv

# Convert between formats
dtcat data.csv --convert parquet -o data.parquet
dtcat report.xlsx --sheet Revenue --convert csv -o revenue.csv
dtcat data.parquet --convert ndjson              # text formats go to stdout

# Override format detection
dtcat data.txt --format csv

# Skip metadata rows above header
dtcat data.csv --skip 2

Example output

# File: sales.parquet (245 KB)
# Format: Parquet

## Data (1240 rows x 4 cols)

| Column  | Type   |
|---------|--------|
| date    | Date   |
| region  | String |
| amount  | Float  |
| units   | Int    |

| date       | region | amount  | units |
|------------|--------|---------|-------|
| 2024-01-01 | East   | 1234.56 | 100   |
| 2024-01-02 | West   | 987.00  | 75    |
... (1190 rows omitted) ...
| 2024-12-30 | East   | 1100.00 | 92    |
| 2024-12-31 | West   | 1250.75 | 110   |

Adaptive defaults

  • Single sheet/file, <=50 rows: shows all data
  • Single sheet/file, >50 rows: first 25 + last 25 rows
  • Multiple sheets: lists schemas, pick one with --sheet

Modes --schema, --describe, --info, and data (default) are mutually exclusive.

--sample N randomly selects N rows; mutually exclusive with --head/--tail/--all.

--convert FORMAT writes to a different format. Use -o PATH for output file (required for binary formats Parquet/Arrow; optional for text formats which default to stdout). Supported targets: csv, tsv, parquet, arrow, json, ndjson.

dtfilter — Query and Filter

dtfilter demo

# Filter rows by value
dtfilter data.csv --filter State=CA

# Numeric comparisons
dtfilter data.csv --filter Amount>1000

# Multiple filters (AND)
dtfilter data.csv --filter State=CA --filter Amount>1000

# Contains filter (case-insensitive)
dtfilter data.csv --filter Name~john

# Select columns
dtfilter data.csv --columns State,City,Amount

# Sort results
dtfilter data.csv --sort Amount:desc

# Limit output
dtfilter data.csv --sort Amount:desc --limit 10

# Window before filter
dtfilter data.csv --head 100 --filter State=CA

# CSV output for piping
dtfilter data.parquet --filter value>0 --csv

Filter operators

Operator Meaning Example
= Equals State=CA
!= Not equals Status!=Draft
> Greater than Amount>1000
< Less than Year<2024
>= Greater or equal Score>=90
<= Less or equal Price<=50
~ Contains (case-insensitive) Name~john
!~ Not contains Name!~test

--head/--tail apply before filtering. --limit applies after. Row count is printed to stderr.

dtdiff — Compare Two Files

dtdiff demo

# Positional diff (whole-row comparison)
dtdiff old.csv new.csv

# Key-based diff (match rows by ID, compare cell by cell)
dtdiff old.csv new.csv --key ID

# Composite key
dtdiff old.csv new.csv --key Date,Ticker

# Float tolerance (differences <= 0.01 treated as equal)
dtdiff old.csv new.csv --key ID --tolerance 0.01

# Only compare specific columns
dtdiff old.csv new.csv --key ID --columns Name,Salary

# Excel sheets
dtdiff report.xlsx other.xlsx --sheet Revenue

# Output formats
dtdiff old.csv new.csv --key ID --json
dtdiff old.csv new.csv --key ID --csv
dtdiff old.csv new.csv --no-color

Example output

--- old.csv
+++ new.csv

Added: 1 | Removed: 1 | Modified: 2

- ID: "3"  Name: "Charlie"  Department: "Engineering"  Salary: "88000"
+ ID: "5"  Name: "Eve"  Department: "Marketing"  Salary: "70000"
~ ID: "1"
    Salary: "95000" → "98000"
~ ID: "2"
    Department: "Marketing" → "Design"
    Salary: "72000" → "75000"

Diff modes

Positional (no --key): Every column defines row identity. Reports added/removed rows only.

Key-based (--key): Match rows by key columns, compare remaining columns cell by cell. Reports added, removed, and modified rows with per-cell changes. Supports composite keys, duplicate key detection, and float tolerance.

Exit codes (diff convention)

Code Meaning
0 No differences
1 Differences found
2 Error

Claude Code integration

Claude Code skills are available in claude-skills. Claude can view data files, analyze schemas, filter rows, and compare files in conversations.

Exit codes

Tool 0 1 2
dtcat success runtime error invalid arguments
dtfilter success runtime error invalid arguments
dtdiff no differences differences found error

License

MIT

About

No description, website, or topics provided.

Resources

License

Stars

Watchers

Forks

Packages

 
 
 

Contributors

Languages