Turn a messy CSV into a clean one with a recipe you can replay

Each change is a step you can preview, switch off, reorder or roll back. IDs like 00123 and 9007199254740993 stay exactly as written, and every removed row is kept in a ledger.

Example data — not saved

Showing synthetic sample data: CRM export clean-up. Open or drop your own file to replace it — files are read in your browser and never uploaded.

Source AUpdating…
Loading…

Arrow keys move; Enter or double-click edits a cell (recorded as a replayable “Cell edits” step). ∅ = missing, · = edge whitespace, ↵ = line break inside a value. Row labels show source:record provenance.

How the workbench is put together

Open a file and CSVUtils reads the original bytes in your browser, guesses the delimiter, and shows how many records were accepted, repaired, padded or rejected. Changing the delimiter, quote or encoding reparses those same bytes, so a wrong guess never costs you data.

The recipe on the left is an ordered list of steps. Click any step to see the table exactly as it is after that step, with its own row counts, findings and removed rows. Disabled steps stay in the recipe; reordering a step simply recomputes everything after it.

The example above is a synthetic CRM export: names with stray spaces and no-break spaces, mixed-case emails, a duplicated customer, dates written day-first, a multi-line note, a formula-like value and a short row. The recipe trims, lowercases emails, removes the duplicate, converts dates with an explicitly chosen format, and flags remaining problems in an issues column.

Exact by default

Every cell is kept as the exact text from the file. Nothing is turned into a number, a date or a formula unless you add a step that says so, and then failures are listed rather than silently blanked. Sums and means use exact decimal arithmetic, so 0.1 + 0.2 is 0.3 and 16-digit account numbers do not drift.

Missing fields (a short record), empty text and whitespace-only text are three different things in the grid, the profile and the filters. Exports explain how missing values are written, because plain CSV has no way to say “null”.

Questions

Is my file uploaded anywhere?

No. Parsing, every recipe step, profiling and export run in your browser, mostly inside a Web Worker. The site has no upload endpoint. Autosave writes to this browser’s IndexedDB only, and you can switch it off with “Private session”.

How big a file can it handle?

The whole dataset is held in memory, so the practical limit depends on your device. Files over 300 MB are refused up front instead of failing halfway. Autosave is skipped above 50 MB and the status line says so. Streaming and disk-backed sorting for larger files are on the roadmap.

Can I reuse a recipe on next month’s export?

Yes. Export the recipe as JSON, then import it on the new file. Columns are matched by ID and name. If a column was renamed or removed, the affected step stops at a preflight check and asks you to pick the column, instead of guessing.

What happens to rows a step removes?

They go to that step’s ledger with their source:record provenance. You can inspect them in the Ledger tab and export them as their own CSV.