Guide
How to Remove Duplicate Emails from a CSV List
Published
You have a contact list in a CSV — two exports stitched together, or a signup file that people typed into themselves — and you know some addresses are in there more than once. The import screen will eventually tell you so, or worse, it will accept the file and email the same person twice.
Three Kinds of Duplicate, and Only One Is Obvious
“Duplicate” means three different things in a contact export, and a plain duplicate check catches only the first one.
| Kind | Example | Caught by comparing whole rows? |
|---|---|---|
| Byte-identical rows | ann@shop.com,Ann,2026-01-04 appearing twice | Yes |
| Same address, different case | Ann@Shop.com and ann@shop.com | No |
| Same address, stray spaces | An address with a space before or after it | No |
| Same person, two addresses | ann@shop.com and ann@home.com | No — and it should not be |
The case difference is the one that surprises people. In the email standard, the domain part of an address follows normal DNS rules and is not case sensitive, while the part before the @ technically is: RFC 5321 says the local-part “MUST BE treated as case sensitive”, then immediately adds that “exploiting the case sensitivity of mailbox local-parts impedes interoperability and is discouraged”. In practice, mail providers deliver Ann@shop.com and ann@shop.com to one inbox, so for a mailing list you almost always want case ignored.
Stray spaces come from copy-and-paste and from spreadsheet cells. A leading or trailing space makes the value a different string, so a naive comparison keeps both rows — and the receiving system may trim the space on import, leaving two contacts that look identical in its own interface.
Why the Extra Copies Cost You Something
- You pay for them. Email and CRM platforms commonly price by the number of contacts you store, so duplicates are billed like real people.
- They use up your import allowance. Import tools cap the rows or megabytes you can send in one go, and duplicate rows spend that budget for nothing. See how to split a CSV to fit an import limit.
- Somebody gets the same email twice. That produces unsubscribes and spam complaints, the two numbers that decide whether your future mail is delivered at all.
- Your reports lie. One dead address listed four times counts as four bounces, and open rates are measured against an inflated recipient count.
Dedupe on the Email Column, Not the Whole Row
Comparing every column is the safe default for a file that was merged twice, but it is the wrong choice here. The same person signing up in January and again in March gives you two rows that differ in the date, the source and perhaps the spelling of their name. Compare only the column that is supposed to be unique, and keep the rest of the row as it is.
- Open the remove duplicates tool and choose your CSV. It is read on your own computer and never uploaded.
- For what makes two rows the same, choose these columns match and tick only your email column.
- Tick Ignore upper and lower case and Ignore spaces at the start and end of values.
- Tick Also save the removed rows to a separate file so you can check the result.
- Press Remove Duplicates and download the cleaned file.
Those two folding options affect the comparison only. The row that is written out is copied as its original text, so Ann@Shop.com stays capitalised, and a ZIP code of 02134 or a long account number keeps every digit — which is not true of a round trip through a spreadsheet. See why Excel removes leading zeros for what that costs.
Which Copy Is Kept
The first one. Rows stay in their original order, and any later row matching one already seen is dropped. That matters when the duplicates are not identical: if the March signup carries a better phone number than the January one, keeping the first copy throws the newer detail away. If you want the newest record, sort the file newest-first before you dedupe — in a spreadsheet, or by asking the exporting system to sort by date descending. Our tools do not sort; they are text tools, not a spreadsheet.
Excel’s Remove Duplicates, and Its Two Real Limits
Excel has this built in: select your range, then Data › Remove Duplicates in the Data Tools group, tick the columns to compare and click OK. Excel keeps the first occurrence of each value and deletes the rest, and Microsoft notes that data is removed from every column even if you ticked only one. It is a permanent deletion, so keep a copy of the sheet first; Ctrl+Z works only straight away. You also cannot run it on outlined data or data with subtotals — remove those first.
Two limits stop it being the answer for a big export:
- The row ceiling. A worksheet holds 1,048,576 rows including the header, and Excel never loads the rest of a longer CSV, so it cannot compare rows it has not read. See Excel’s row limit explained.
- Excel edits the other columns while you are in there. Opening a CSV converts values: leading zeros vanish, numbers longer than 15 digits are rounded, and codes such as
1-2become dates. Microsoft is explicit that duplicate comparison “depends on what appears in the cell — not the underlying value stored in the cell”, so two IDs that differed in the file can look identical after conversion, and one of them is deleted.
Google Sheets: Data Cleanup and UNIQUE
In Sheets, run Data › Data cleanup › Trim whitespace first, then Data › Data cleanup › Remove duplicates, choosing the columns to compare and whether the range has a header row. For a list of distinct addresses without touching the original, =UNIQUE(A2:A) in a spare column does it, and =LOWER(TRIM(A2)) gives you a normalised column to compare on. Normalise it yourself rather than assuming a duplicate finder ignores case, and you know exactly what was compared. The ceiling Google publishes is 10 million cells per spreadsheet, which by simple division puts a 12-column contact file out of room at roughly 830,000 rows.
Check the Result Before You Delete Anything
The removed-rows file is the point of the exercise. Open it and the deleted rows are listed under the header. Two checks take a minute: the kept rows plus the removed rows should equal the original row count (see how to count the rows in a CSV), and nothing in the removed file should surprise you. If it contains rows whose email column is empty, that is worth knowing — every blank counts as the same value as every other blank, so all but the first blank row are removed.
Don’t Over-Dedupe
Some addresses look like duplicates but are not the same string, and some providers treat them as one mailbox while others do not. Gmail is the well-known case. On dots, Google’s help is explicit: “If the sender added dots to your address, you’ll still get that email”, so john.smith@gmail.com and johnsmith@gmail.com are one mailbox. On plus tags, Google’s Workspace help says you “can create variations of your email address where all messages arrive in your current inbox” by adding “a plus sign (+) and any word before the @ sign”, so john+news@gmail.com reaches the same person as john@gmail.com.
Those are Gmail’s rules, not email’s rules. RFC 5233 describes the “+detail” convention as site-specific and implementation-specific, and on an ordinary company domain ann.brown@acme.com and annbrown@acme.com can easily be two different people. Our tool compares the text as written, ignoring only case and outer spaces if you ask it to; it applies no provider-specific rules. That is deliberate. If you do want to collapse plus tags, do it knowingly: build a normalised column in a spreadsheet, restrict it to the domains you are sure about, and keep the original address for sending.
A Sensible Order of Operations
- Merge the exports into one file first, so duplicates across files become visible.
- If characters or separators look wrong, fix the encoding and delimiter before anything else.
- Sort newest-first if you want the newest copy of each contact kept.
- Remove duplicates on the email column, ignoring case and outer spaces, keeping the removed rows.
- Check the counts, then split the file if it is over your import limit.
One thing to be clear about: these tools clean CSV text. They do not check whether an address exists and do not produce an .xlsx file. For validation, use your email platform’s own verification step; for editing individual records, use a spreadsheet — LibreOffice Calc is free and asks you, column by column, how to read a CSV when it opens one.