Metadata-Version: 2.4
Name: viewcli
Version: 0.1.0
Summary: Universal tabular data viewer CLI — view any file in a fast terminal UI
License: MIT
Requires-Python: >=3.10
Requires-Dist: duckdb>=0.10.0
Requires-Dist: openpyxl>=3.1.0
Requires-Dist: rich>=13.0.0
Requires-Dist: textual>=0.61.0
Requires-Dist: typer>=0.9.0
Provides-Extra: dev
Requires-Dist: pytest-asyncio>=0.21; extra == 'dev'
Requires-Dist: pytest>=7.0; extra == 'dev'
Description-Content-Type: text/markdown

# view-data

**Universal tabular data viewer** — open any CSV, JSON, Parquet, or Excel file in a fast, interactive terminal UI with sort, filter, search, and SQL — all in one command.

```
view file.csv
view data.json --sql "SELECT name, age FROM data WHERE age > 30"
view results.parquet
view sheet.xlsx
view --sql "SELECT * FROM 'a.csv' JOIN 'b.json' USING(id)"
```

---

## Install

```bash
# From source
pip install .

# Or with pipx (recommended — isolated environment)
pipx install .
```

Requires Python 3.10+.

---

## Usage

```
view <file>                          Open a file in the TUI
view <file> --format csv             Force format detection
view <file> --head 1000              Load only first 1 000 rows
view <file> --sql "SELECT …"         Run SQL before viewing (table alias: data)
view --sql "SELECT … FROM 'a.csv'"   Cross-file SQL (no positional file needed)
view --version
view --help
```

### Supported formats

| Extension | Format |
|-----------|--------|
| `.csv`, `.tsv`, `.txt` | CSV / TSV (delimiter auto-detected) |
| `.json` | JSON array-of-objects |
| `.jsonl`, `.ndjson` | Newline-delimited JSON |
| `.parquet` | Apache Parquet |
| `.xlsx`, `.xls` | Excel (first sheet) |

---

## Keybindings

### Navigation
| Key | Action |
|-----|--------|
| `↑ ↓ ← →` | Move cursor |
| `Page Up / Page Down` | Scroll by page |
| `Home / End` | First / last column |
| `g` | Jump to first row |
| `G` (Shift+G) | Jump to last row |
| `Enter` | Expand full cell value |

### Sorting
| Key | Action |
|-----|--------|
| `s` | Sort by current column (asc → desc → clear) |

### Filtering
| Key | Action |
|-----|--------|
| `/` | Open filter bar |
| `Esc` | Clear all filters |

Filter syntax:

```
name=Alice          exact match
age>30              numeric comparison
city~New.*          regex match
age>=18 city~NY     AND (space-separated)
```

### Search
| Key | Action |
|-----|--------|
| `Ctrl+F` | Open search (all visible cells) |
| `n` | Next match |
| `N` (Shift+N) | Previous match |
| `Esc` | Clear search |

### Columns
| Key | Action |
|-----|--------|
| `c` | Open column show/hide picker |
| `<` | Shrink current column |
| `>` | Grow current column |

### SQL
| Key | Action |
|-----|--------|
| `:` | Open SQL prompt (table alias: `data`) |

Example: `: SELECT city, COUNT(*) AS n FROM data GROUP BY city ORDER BY n DESC`

### Export & Other
| Key | Action |
|-----|--------|
| `e` | Export current view (CSV or JSON) |
| `?` | Show help overlay |
| `q` / `Esc` | Quit |

---

## SQL Examples

```bash
# Filter before viewing
view employees.csv --sql "SELECT * FROM data WHERE salary > 100000"

# Aggregate
view orders.csv --sql "SELECT product, SUM(amount) as total FROM data GROUP BY product"

# Cross-file join (no positional file)
view --sql "SELECT a.name, b.order_count FROM 'customers.csv' a JOIN 'orders.json' b ON a.id = b.customer_id"

# Nested JSON — access struct fields with dot notation
view events.json --sql "SELECT meta.page, meta.duration_ms FROM data WHERE event='click'"
```

---

## Screenshot

*(placeholder — run `view tests/fixtures/sample.csv` to see it live)*

---

## Development

```bash
python -m venv .venv
source .venv/bin/activate
pip install -e ".[dev]"

# Generate test fixtures
python tests/fixtures/create_fixtures.py

# Run
view tests/fixtures/sample.csv
view tests/fixtures/sample.json --sql "SELECT id, title FROM data LIMIT 5"
```
