CSV Deduplicator

Files & data

Remove repeated rows, and name the ones that only looked repeated.

Deduplicated CSV
email,name,phone,city [email protected],Juan Cruz,09175551234,Cebu [email protected],Ana Reyes,09281234567,Davao [email protected],Mark Santos,09171112222,Cebu
5 rows in · 3 kept · 2 removed
Rows in5
Kept3
Removed2
Conflicts1
Compare on
What matched
[email protected]rows 2, 4 · kept 2
[email protected]rows 3, 6 · kept 3conflict
1 group of rows matched on the key columns but its rows differ somewhere else, so they are not really duplicates — they are records about one thing, holding different values. Keeping the first one throws the rest away without anybody reading them. They are listed below by row number; reconcile them by hand before you rely on this.
Rows were compared on email only. Everything outside those columns was ignored when deciding what counts as the same row — which is what makes a key useful and is also how a row with real data in it gets dropped.
Values were compared after trimming the ends, ignoring case. The original text is kept in the output — only the comparison was relaxed.

How to use

What it's for

Take the repeated rows out of a list — a mailing list, a sign-up sheet, a customer export — and see exactly which rows were treated as the same.

Before you start

Have the spreadsheet open, or the .csv file in a text editor, and know which column makes two rows the same person, such as the email. You paste the rows in; nothing is uploaded.

  1. Set up how the rows are read

    In Delimiter, pick Tab if you will copy from Excel or Google Sheets, or Comma for most .csv files. Leave First row is a header ticked if the first row holds the column names.

  2. Choose which copy stays

    In Which one to keep, The first keeps the earliest row of each set of repeats and The last keeps the latest — usually the newest, if new rows go at the bottom.

  3. Decide how strict to be

    Ignore case treats capitals and small letters alike, and Trim the ends ignores spaces around a value; both start ticked. Tick Collapse runs of spaces too if names may hold a double space.

  4. Paste the rows and pick the column to match on

    Paste into the CSV box, replacing the sample. Under Compare on, tick the column that makes two rows the same, such as the email; with none ticked, rows must match in every column.

  5. Remove the duplicates and copy

    Press Remove duplicates to bring the result into view — it also updates as you change things. Check the list under it, then press Copy.

Reading the result

  • Deduplicated CSV: your rows with the repeats taken out. The rows that stay keep their values exactly.
  • Rows in, Kept and Removed: how many rows you pasted, how many stayed, and how many went.
  • What matched: each set of repeats with its row numbers and the row kept. Conflicts counts the sets that differ outside your chosen column, so they may not be true repeats.

If it goes wrong

  • It missed repeats you can see: a space at the end, a capital letter or a double space makes two rows different. Tick the matching box from step 3.
  • A set is marked conflict: its rows share your chosen column but differ elsewhere, such as one email with two phone numbers. Check those rows before you trust the result, because only one of them is kept.
  • A note says rows do not have the same number of fields: a value holds the separator with no quote marks around it, so that row can never match another. Fix it and paste again.

What this is

“Duplicate” is not a fact, it is a decision. Juan Cruz, juan cruz and Juan  Cruz  are three strings, one person, and possibly three customers, depending on where the file came from.

A tool that compares raw text finds none of them. One that normalises hard merges people who are genuinely different. Neither is right in general, so both are reachable here and the page says which one produced the number.

But the more useful thing is not the count, it is the conflict.

When two rows match on the key and differ outside it — one email, two phone numbers — that is not a duplicate. It is two records about one thing, and keeping the first is a coin toss dressed up as a rule. Every such group is listed by row number, so a person makes the choice.

Nothing is silently dropped. Every removed row is listed under the group it belonged to.

Questions

Is my spreadsheet uploaded anywhere?

No. There is no upload and no file picker — you paste the rows in and the work happens in your browser, in this site’s own calculation engine. Nothing is transmitted, logged or stored.

Why did it not find the duplicates I can see?

Almost always because of how it compared. A trailing space, a capital letter or a second space inside a name makes two rows different text, and by default only the first two of those are ignored. The three switches decide it, and the count changes with them — which is the honest version, because there is no setting that is right for every file.

What does choosing key columns actually do?

It declares that two rows with the same email — or the same id, or the same name and city together — are the same row, whatever else differs. That is the powerful setting and the dangerous one: everything outside the key stops being looked at, so a row carrying a phone number nothing else has can be dropped for matching on a column nobody read.

What is a conflict?

A group of rows that matched on the key and differ somewhere else. Those are not duplicates at all — they are two records about one thing, holding different values, and keeping the first is a coin toss dressed up as a rule. They are listed by row number so you can reconcile them by hand, which is the one job this tool deliberately will not do for you.

Why does it list every matched group, not just a count?

Because a deduplicator that answers only with a smaller file gives you no way to check it did the right thing, and the failure you care about — a row that should have stayed — leaves no trace. Every group is listed with its row numbers and which one survived, so the output can be audited rather than trusted.

Does keeping the first or the last matter?

Only when the rows differ, which is exactly when the page marks them as a conflict. For identical rows it makes no difference at all. When it does matter, the last is usually the more recent record and the first is usually the original one — but the file cannot tell you which, so the tool does not pretend to know.

Are the kept rows changed in any way?

No. The values are written back exactly as they were read, including the spaces and the capitals the comparison ignored. Quoting is re-applied where RFC 4180 requires it and dropped where it does not, so a field that was quoted for no reason comes back unquoted — reading the output gives the same values either way.

Why are rows with the wrong number of fields never duplicates?

Because a short or long row is compared as what it is, and it holds a different number of values from every other row, so it can never match one. That is usually a delimiter inside an unquoted field, which shifts everything after it. Those rows are listed so you can fix the quoting first.

The maths

How many duplicates one file has
Compared rawthe fewest
+ trim the endsmore
+ ignore casemore again
+ collapse spacesthe most
Key columns onlya different question
Each step down finds more duplicates and risks merging people who differ. No setting is right for every file.
Why the key is not joined on a comma

Join a key on a comma and ["a,b", "c"] and ["a", "b,c"] become the same key — two different rows reported as duplicates, which for a deduplicator means deleting one of them. This uses a character that cannot occur inside a field.

Keep going

Important

Nothing you paste is transmitted or stored. Choosing key columns means everything outside them is ignored when deciding what counts as the same row, so a row holding real data can be dropped — read the conflicts before relying on the result. Nothing you type here is sent to our servers — the calculation runs entirely in your browser.