Every CSV export from every system has its own particular mess, stray spaces, blank trailing rows, the same customer twice, one column doing the job of three.

Free data tool

CSV Cleaner

Trim whitespace, remove empty rows, dedupe, and split a column into several. Nothing you paste is uploaded.

Runs entirely in your browser using JavaScript. Nothing you paste here is sent to a server, logged, or stored.

Why "first occurrence wins" for duplicates

When two rows match, deciding which one to discard needs a rule, and keeping whichever came first in your original file is the least surprising choice, it preserves your original ordering for everything that survives. If you'd rather keep the last occurrence instead (the most recently updated row, for example), sort your data so the version you want to keep comes first before running it through here.

CSV cleaner FAQ

What counts as a "duplicate" row?

When matching on the whole row, every cell in two rows has to be identical after trimming for them to count as duplicates. When matching on a single column instead (an email or ID column, for example), only that one column's value needs to match, useful when the same person appears twice with slightly different data elsewhere in the row and you want to keep just one.

Which duplicate row gets kept?

The first one. When two or more rows match, this tool keeps the first occurrence in your original order and removes the ones that come after it, rather than picking one arbitrarily.

How does splitting a column handle rows with different numbers of parts?

The column expands to fit whichever row splits into the most pieces, using that as the number of new columns for every row. Rows that split into fewer pieces than that get blank cells for the columns they don't have data for, rather than misaligning the rest of the row.

Does this handle quoted fields with commas inside them?

Yes. A field wrapped in double quotes can safely contain your chosen delimiter, a line break, or a doubled quote mark, standard CSV quoting rules (RFC 4180) are parsed correctly rather than naively splitting on every delimiter character.

Is my data uploaded anywhere?

No. Parsing, cleaning and splitting all happen in your browser. Nothing you paste is sent to a server, logged, or stored.

Embed this free tool on your site

Paste this where you want the tool to appear. Please keep the credit link — it is how we keep these tools free.

Free CSV cleaner by ANUPRESS

Four cleanup jobs, one pass

Trimming whitespace catches the invisible problem: ” Berlin” and “Berlin” look identical in a spreadsheet cell but compare as different strings to any system reading the file, which quietly breaks lookups and joins downstream. Removing empty rows clears out the blank lines a spreadsheet export often leaves at the end. Both run automatically here before anything else, so the duplicate check that follows is comparing genuinely equivalent values, not values that only differ by accidental whitespace.

Two different meanings of “duplicate”

Matching on the whole row asks whether two rows are identical in every column, useful when you’ve genuinely got the exact same record twice. Matching on a single column instead, an email address or a customer ID, asks a narrower question: does this one field repeat, regardless of what else differs in the row. That second mode is what actually finds a customer who signed up twice with a slightly different name or a typo’d city the second time, a duplicate that whole-row matching would miss entirely because the rows aren’t technically identical.

Splitting a column without losing anyone’s data

A “full name” column pasted into “first” and “last” name fields runs into a real problem the moment someone has three names or a hyphenated one: naive splitting either drops data or breaks alignment across the whole sheet. This tool finds whichever row splits into the most pieces first, uses that as the number of new columns for everyone, and pads shorter rows with blank cells rather than shifting every other row over. Nobody’s second or third name silently vanishes because someone else in the list only had two.