To remove duplicate rows from a CSV, decide which columns make two rows the same record, such as email, then keep one row per value of those columns. FindUtils CSV Dedupe does this in your browser: pick the key columns (or none, to compare whole rows), keep the first or the last copy, and download the cleaned file plus a second file holding every removed row. The kept rows stay in their original order, and the cells are written back exactly as they were. The file is not uploaded.

This guide covers choosing the key, the matching options, what happens to blank keys, and the kind of duplicate the tool does not try to find.

Why Exports Collect Duplicates

CRMs, newsletter tools, form builders and shops rarely stop a record from being added twice:

  • The same person signs up twice, from two forms or two campaigns.
  • Case and spacing differ. [email protected] and [email protected] are the same address to a mail server, but not to an exact comparison.
  • An import runs twice and appends every row again.
  • An append-only log holds one row per update, and you want the latest per customer.

Sending to that list means the same person gets the same message more than once.

How to Dedupe a CSV

Step 1: Load the file

Open CSV Dedupe and drop a .csv, .tsv or .txt file on the Input area, choose one, or paste the text. The delimiter is detected from the first line; set it under File format if the guess is wrong.

Step 2: Pick the key columns

Pick the columns that decide a duplicate, for example email. Pick several for a composite key, such as first_name + last_name + postcode. Leave all unpicked to remove only rows that repeat in every cell.

Step 3: Choose which copy to keep

Under When a row repeats, keep, choose First row to keep the earliest occurrence of each key or Last row to keep the latest. Then set Trim whitespace and Ignore case.

Step 4: Check and download

The status line shows how many rows were read, kept and removed. Check the Kept rows and Removed duplicates tabs, then download the cleaned file and, if you want a record, the duplicates file.

A Worked Example

This list has one person twice under the same email:

1
2
3
4
email,name
[email protected],Ada
[email protected],Bob
[email protected],Ada Lovelace

With email as the key and the first copy kept, the cleaned file is:

With the last copy kept, the cleaned file keeps the newer name, and Bob stays in front because kept rows never change order:

1
2
3
email,name
[email protected],Bob
[email protected],Ada Lovelace

The duplicates file for that run holds the removed row under the same header: [email protected],Ada.

How Trim and Ignore Case Change the Result

Trim whitespace is on by default and Ignore case is off. Here is one column, email, with three spellings of one address:

Trim whitespaceIgnore caseRows keptWhy
OnOff (default)3The letters differ in case
OffOn2[email protected] keeps its spaces, so it differs from the other two
OnOn1All three reduce to [email protected]; the first, [email protected], is kept

The kept row is written exactly as it was, capitals and spaces included. The options change only the comparison.

For email addresses, Ignore case is usually safe. For names, IDs and codes it usually is not: AB-1 and ab-1 may be different products.

What Happens to Rows With an Empty Key?

By default, a row whose key cells are all empty is kept as unique. Ten subscribers with no email address are ten different people, not one. Choose Collapse into one under Blank keys to deduplicate empty keys like any other value, which keeps one of them. A cell of only spaces counts as empty.

This applies to key columns only. With no key picked, whole rows are compared, and two completely identical rows are duplicates whatever they contain.

Exact Matching Only: What It Will Not Find

CSV Dedupe removes rows whose keys match exactly after the optional trimming and case folding. It does not guess:

Row ARow BDuplicate?
[email protected][email protected]Only with Ignore case on
[email protected][email protected] Yes with Trim on (the default)
Jon SmithJohn SmithNo: different text
+44 20 1234020 1234No: phone formats are not normalised
[email protected][email protected]No: different addresses

Deciding that two differently written records belong to one person is fuzzy matching, and the tool does not attempt it. Rows it leaves alone stay in the cleaned file for you to review.

CSV Dedupe vs Spreadsheet Remove Duplicates

FeatureCSV DedupeSpreadsheet "Remove duplicates"
Choose key columnsYesYes
Keep the last copyYesNo: the first occurrence is kept
Separate file of removed rowsYesNo: rows are deleted in place
Ignore spaces and caseCheckboxesNeeds helper columns or formulas
Values changed on the way inNever: the text is written back as readOpening a CSV can drop leading zeros or turn values into dates
Fuzzy matchingNoNo

Common Mistakes

Keying on a name column. Two people can share a name. Use email or an ID, or combine name with a second column.

Keeping the first copy of an append-only log. In a log where later rows are newer, keep the last copy.

Deduping one export when the duplicates span two. Combine the files first with CSV Merger, then dedupe the merged file.

Using it on a plain list. For one value per line with no header, Duplicate Line Remover is simpler.

Use It From Code

The same logic is the csv_dedupe tool on the FindUtils REST API and MCP server. Text sent there is processed on the server rather than in your browser.

1
2
3
curl -X POST https://api.findutils.com/api/tools/csv-dedupe/execute \
  -H "Content-Type: application/json" \
  -d '{"csv":"email,name\[email protected],Ada\[email protected],Bob\[email protected],Ada L\n","keys":["email"],"keep":"last","ignore_case":true}'

Other arguments: trim, blank_keys (distinct or collapse), delimiter and header. The response holds cleaned_csv, duplicates_csv, the counts and a preview of up to 50 removed rows. Input can be up to about 10 MB. See the API reference and the MCP reference.

Tools Used in This Guide

ToolUse
CSV DedupeRemove duplicate rows by key columns or whole rows
CSV MergerCombine several CSV files before deduplicating
CSV DiffCompare the cleaned file with the original by key
CSV ViewerRead a large CSV as a table
Duplicate Line RemoverRemove repeated lines from a plain list
Dedupe BookmarksThe same job for browser bookmarks

FAQ

How do I remove duplicate emails from a CSV mailing list?

Load the file in CSV Dedupe, pick the email column as the key, turn on Ignore case, and download the cleaned file. Trim whitespace is already on, so addresses with stray spaces match too.

Which copy of a duplicate is kept?

The first occurrence by default, or the latest when you choose Last row. Either way, the kept rows stay in their original file order.

Does it change my data?

No. Cells are written back exactly as they were read, including spaces and letter case. Only which rows are kept changes.

Can it find near-duplicates like Jon and John?

No. Matching is exact after the optional trimming and case folding. Different spellings, typos and reformatted phone numbers are different values.

Is my file uploaded?

On the page, no. The file is read and processed in your browser tab.

Next Steps

Clean your export with CSV Dedupe. To see exactly which rows changed between the original and the cleaned file, compare them with CSV Diff.