Fast import

Open a CSV file

Data stays in your browser — nothing is uploaded to a server.

Drop CSV here or click to browse

.csv, .tsv, .txt — up to ~500 MB

Choose File
Separator
Free · No upload · No account

A CSV editor that actually handles the hard parts for free

Most online CSV editors give you a table you can type into. This one gives you a data workbench: automatic column type detection, multi-rule filters with boolean and null operators, SQL-style group-by with aggregates, bulk transforms scoped to filtered or selected rows, undo for everything, and export to CSV, JSON, or Word — all running in your browser with no server, no account, and no file size cap imposed by an upload limit. If you work with data exports, product catalogs, payroll files, or any kind of structured list, this is the gap between Excel (too heavy) and a plain text editor (too primitive).

1M+rows via chunked parsing
200step undo history
0bytes sent to any server
4export formats: CSV · JSON · TXT · DOCX

How to use the CSV editor

Six stages from raw file to clean export — click any step to expand it.

01

Open your data — three ways

Drop a CSV file directly onto the upload zone, paste raw text with any delimiter (comma, tab, pipe, semicolon, or custom), or load straight from a public URL. The first-row header toggle and custom-separator field are right there before you parse anything, so you never need to reimport because you chose the wrong setting.

Why this matters: the URL loader works with GitHub raw files, public Google Sheets CSV exports, and any server that allows CORS — useful for pulling live data snapshots into the editor without saving them locally first.

How it processes your data

The entire pipeline runs in your browser tab in this exact order. No black boxes.

csv-editor-pipeline.ts
01parse()
// Text → columnar arrays. One string[] per column. No row-object creation, no repeated key strings. Memory scales with data width × row count, not row count × column count squared.
02detectType()
// Sample up to 200 values per column. Score each as integer, float, boolean, date, email, URL, or string. Return the dominant type + confidence score.
03filter(indices, rules)
// Start from a number[] of all row indices. Apply each FilterRule against columns[rule.column][rowIndex]. AND logic = every rule must pass. OR logic = any rule passes.
04sort(indices, rules)
// Sort the filtered index array. Numeric columns compare as numbers. String columns compare lexicographically. Multi-column sort applies rules left to right.
05groupBy(indices, spec)
// Bucket indices by columns[groupCol][rowIndex]. For each bucket, run the aggregate functions (sum, avg, min, max, count, countDistinct) over the specified columns.
06render(indices[page])
// Slice the index array to the current page. Virtual scroll within that page — only the rows visible in the viewport are in the DOM at any time.

The key architectural decision is storing data as one array per column rather than one object per row. This means editing a single cell writes to one slot in one array — not cloning an entire row object inside a million-element array. Sort and filter produce a reordered number[] of indices; they never copy the underlying data.

Real scenarios

Three situations where opening a spreadsheet app is the wrong move.

Data cleanup

Cleaning a customer export before CRM import

Before

  • email column has leading/trailing spaces
  • "active" column contains "TRUE", "true", "1", "yes" mixed
  • created_at has 4 different date formats
  • 340 duplicate emails across 12,000 rows

After — using this tool

  • Trim whitespace → email column normalized in one click
  • Boolean type auto-detected → is-true filter works instantly
  • Normalize dates → all rows now YYYY-MM-DD
  • Remove duplicates by email → 340 rows gone, undo available
Catalog audit

Auditing a product catalog before a supplier upload

Before

  • 4,800-row product feed, price column is float
  • Need to find every product priced under £5 and over £500
  • Want the count and average price per category
  • Final file should only include active products as CSV

After — using this tool

  • Filter: price < 5 OR price > 500 → 217 rows flagged
  • Group by category, add AVG(price) + COUNT → category summary
  • Add second filter: status equals "active"
  • Export → filtered CSV, 3,941 rows, custom filename
Sensitive data

Processing a payroll export without sending it anywhere

Before

  • Sensitive HR data — cannot upload to any external server
  • 22 columns including salaries, tax codes, bank details
  • Finance team needs total payroll and average salary by department

After — using this tool

  • Opened locally — zero network requests, zero server contact
  • Group by department → SUM(gross_salary) + AVG(gross_salary)
  • Export summary as DOCX for the board pack
  • Original file untouched — tab closed, data gone

Questions people actually ask

The things that matter before you commit to loading a file into any tool.

UntangleTools Logo
UntangleTools Logo
UntangleTools Logo