Skip to content
All builds

SalveCSV Doctor

What it does for you

A CSV doctor that diagnoses 20-plus problems with a health score, applies toggleable pure fixes with a cell-level diff and change log, and never guesses an ambiguous date.

Salve screenshot

Screenshots

Salve screenshot 1

In more detail

Salve takes a messy CSV file, tells you exactly what is wrong with it and how bad it is, and hands back a cleaned copy with a log of every cell it changed. It catches things like the wrong delimiter, repeated headers, padded names, mixed date formats, and "NY" sitting next to "ny". And it refuses to guess when a date like 03/04/2026 could mean two different days.

Honest limits

Large files are not streamed, so a very big export could freeze the tab. European number formats like 1.234,50 are not their own type yet, so those currency columns show as text. The optional Claude mode validates every suggested mapping against the real values, but it was not run against live responses. Tested on three messy fixtures, not on a pile of real-world exports.

How I built it

Claude Cowork ran this one end to end in a single autonomous pass, about 0.8 hours, as part of my "one-shot all the Cowork projects" instruction. It wrote a one-page spec, then the core, three messy fixture files, the tests, a Node CLI, the page, and a Cowork skill. Then it captured screenshots and a printed report with Playwright, looked at them, and fixed a legend showing a raw escape code and a print layout that pushed each card onto its own page.

The core, salve.js, diagnoses 20-plus problem types, scores file health from 0 to 100, and builds a fix plan of 13 toggleable pure transforms. Every fix records before and after per cell, so the diff, the change log, and the CLI output all come from one list. The page, the CLI, and the tests all use the same core. The CLI and the Cowork skill always write new files beside the original and never overwrite it.

Claude Cowork also wrote its defaults (near-duplicate removal off, ambiguous dates never guessed) into the case study so they can be reviewed instead of discovered.

What I learned

  • Delimiter sniffing works when you parse with each candidate and score how many rows share the same field count. A semicolon file full of decimal commas has more commas than semicolons, but only semicolons give every row the same width.
  • A date column's own evidence can point both ways. The sample file has 02/14/2026 (only month-first works) and 13/02/2026 (only day-first works), so any automatic guess for 03/04/2026 is wrong for part of the file. Flagging it and leaving it as-is was the only honest default.
  • Fix order changes the diagnosis. After trimming and casing, a near-duplicate becomes an exact duplicate, so removals stay tied to the original diagnosis the user actually saw.
  • Zip and phone detection need evidence beyond the regex (a header hint, a leading zero, separators), or a column of 5-digit customer IDs turns into zip codes.

What carried forward

It shares a conclusion with #32 Ledgerline, a Claude Code build: flag ambiguous dates, do not guess them. Two different tools reached the same rule on different days. It also hit the same problem as #38 Tidings in the Cowork batch: the file-writing step turned unicode escapes into literal em dashes, and both builds added a per-file dash check to their tests.

If I took it further

I would stream large files in chunks with a Web Worker, add locale-aware number parsing, and let the user edit a canonical spelling directly in the fix plan.

#040 Built with Claude Cowork September 23, 2026 285 automated checks

Want one like this?