A CSV explorer and cleaner that turns a messy export into a tidy, ready-to-use
file without a spreadsheet, a script, or an upload. Paste CSV straight from a clipboard
or load a .csv file, and the tool immediately renders it as a sortable, filterable
table. It is built for the everyday data chores that eat time: spotting duplicate rows
in an email list, stripping the blank lines a database export tacks on, trimming the
stray spaces that break a downstream import, and pulling out just the rows you care
about before handing the file to someone else. Everything happens in your browser, so
even a customer list, a payroll extract, or an unreleased product roadmap stays on your
machine.
How it works
Your text is parsed with a standards-compliant CSV reader (PapaParse) that correctly handles the awkward cases hand-rolled parsers miss — fields wrapped in quotes, commas and line breaks inside a quoted value, and escaped double-quotes. The first row becomes the header, and every data row is padded or trimmed to the header width so the grid stays perfectly rectangular even when the source file is ragged.
Three cleaning toggles then run over the data, in order: Trim whitespace removes leading and trailing spaces from every cell; Remove empty rows drops any row that is blank in all columns (including rows that are nothing but commas); and Remove duplicate rows keeps only the first occurrence of each identical row. Because trimming runs first, de-duplication also catches “same value, different padding” duplicates. A live counter shows columns, rows in, rows after cleaning, how many were removed, and how many are currently visible through the filter.
Sorting and filtering sit on top as a non-destructive view: click a header to sort
ascending, again for descending, a third time to clear; type in the filter box to keep
only rows matching across any column. Neither affects what you export — Download cleaned
CSV and Copy CSV always emit the fully cleaned dataset, properly re-quoted. Your CSV
and options are remembered in localStorage, so the page picks up where you left off.
Example
Suppose a signup export arrives with trailing blank rows, a duplicated record, and inconsistent spacing:
| name | role | city | signups |
|---|---|---|---|
| Ada | Engineer | London | 124 |
| Cleo | Engineer | London | 124 |
| Cleo | Engineer | London | 124 |
| (blank) | (blank) | (blank) | (blank) |
| Faye | Engineer | Lagos | 203 |
Turn on Trim whitespace, Remove empty rows, and Remove duplicate rows and the
blank line and the second Cleo disappear — the counter reads “4 columns · 5 rows in · 3
after cleaning (−2 removed)”. Click the signups header and it sorts numerically (203
above 124, not the other way around). Type London in the filter to show only the London
rows, then click Download cleaned CSV to save the result. Every figure and every row
is processed locally — nothing is uploaded or stored on a server.