How to Compare Two CSV Exports: Find New, Removed and Changed Contacts
To compare two CSV exports of one contact list, match the rows on the email address and sort every contact into one of four groups: added, removed, changed or unchanged. Added contacts exist only in the newer file. Removed contacts exist only in the older one. Changed contacts are in both with a different value in at least one column. The free compare two CSV files tool does the matching in your browser and lists each change.
When this comes up
- Monthly CRM or list exports. You want to know what moved since the last pull before you start the next sequence.
- A refreshed lead file from a data provider that overlaps with the one you bought last quarter. You only want the rows that are new.
- After an enrichment run. Which contacts got a new title or company, and which were left alone?
- Before a re-verification. The list is a month old. Rather than re-run all of it, find what's new.
- Handing off between teammates, where two people each edited a copy.
The question in every case is the same: what is different, and does any of it need action?
Step 1: match on the right key
Email is the only column that is nearly unique and nearly stable. Names get re-typed, companies get renamed ("Northwind Inc." becomes "Northwind"), and phone numbers change format. Normalize before comparing:
- Trim spaces.
- Lower-case the address (case isn't part of how the address is matched in practice, and mixed case in exports is common).
- Take the address out of name wrappers such as "Ana Silva ana@northwind.example". The tool reads only cells that hold a plain address.
Two rows in one file with the same address can't both match one row in the other. The tool keeps the first and counts the repeats, and also counts rows with no address. Look at those counts before trusting the rest. If the repeats are high, de-duplicate first; merging lead lists without duplicates covers it.
Step 2: read the four groups
| Group | Meaning | What to do |
|---|---|---|
| Added | In the newer file only | Verify these. They have never been checked. |
| Removed | In the older file only | Find out why: unsubscribed, bounced, deleted or just not exported? Don't re-add without a reason. |
| Changed | In both, a field differs | Review the changes; update records; consider re-verifying if the company changed. |
| Unchanged | Identical in the shared columns | Leave. If they were verified earlier, they stay verified until the list ages. |
The columns comparison is separate. The tool lists columns that exist in both files (compared) and columns in only one (not compared), which catches an export setting that quietly dropped or renamed a field.
Step 3: read the changed contacts
Each changed contact is listed per field, with the address, the column, the old value and the new value. Three patterns are worth knowing:
- Cosmetic changes. "northwind" to "Northwind Traders", a re-formatted phone. Accept them.
- Role changes. A new title at the same company. The address probably still works.
- Company changes. The person has moved. The old work address may now bounce, or belong to someone else, and the new one may be in a different column. Treat the address as unverified and check it again.
A suppressed or bounced contact reappearing as "added" is a different problem: you've re-imported an address you shouldn't. Compare against your suppression file, as in cold email suppression lists, before sending.
Step 4: verify only what's new
Verification answers one question about one address at one time. For unchanged contacts you have an earlier answer, and for the added ones you have none. So the efficient order is:
- Take the added group out of the comparison. The tool passes those addresses on to the verifier.
- Verify them.
- Merge the valid ones into the main list. Suppress the invalid ones. Put risky and catch-all rows in a small, slower group; what to do with catch-all emails explains the choice.
- Re-check the old, unchanged part of the list on a schedule, because addresses go stale even when nothing in the file changes. How often to verify an email list gives the intervals.
If most of a file is old, there's no hurry to re-check all of it today, but a list you haven't mailed in months should be verified in full before you use it. The comparison tells you what is new, not what is still alive.
By hand in a spreadsheet
For small files:
- Put the two exports on two sheets with the address in column A of each, cleaned as above.
- In the new sheet, add a column with a lookup of each address in the old sheet. No match means added.
- In the old sheet, do the same against the new. No match means removed.
- For addresses in both, add one comparison column per field.
It is dependable, and slow once you pass a few columns. Mistakes tend to come from step 1: an uncleaned address with a trailing space looks like a removed contact and an added one at the same time.
Quick answers
- Does order matter? The older file goes in the first box and the newer in the second. Swap them and "added" and "removed" swap.
- Does it need the same column order in both files? No. Columns are matched by header name.
- Is my list uploaded? The comparison runs in your browser.
- What if one file has no email column? Then there's no key to match on, and the comparison can't run.
Try it on your own list
Upload a sample at /verify. The first 100 checks are free with a Google sign-in, no card.
Pro, $39 a month: Unlimited email verification.* Never metered, never cut off. See pricing.
*Fair use: the first 100,000 checks a month at full speed, then slower, never cut off.
Common questions
How do I compare two CSV files by email address?
Lower-case and trim the address column in both files, then list addresses that appear only in the new file (added), only in the old file (removed) and in both. For the ones in both, compare the other columns cell by cell. The free tool does all of that for two pasted or uploaded exports.
Can I do it with VLOOKUP in Excel?
Yes. Put both lists in one workbook and use a lookup on the email column in each direction: addresses in the new list that return no match are added, and addresses in the old list with no match are removed. It doesn't compare the other columns, which is the slow part by hand.
Why compare instead of verifying the whole new file?
Because most of it you already verified. Checking only the added addresses saves time, and keeps your verification focused on the rows that have never been tested.
What if the two files have different columns?
The tool compares the columns present in both and lists the ones only in one file, so you can see what changed in the structure. The added and removed lists still work on the address alone.
What counts as a changed contact?
The same email address in both files, with at least one shared column holding a different value. Each changed cell is listed with the before and after values.
Check your list before you send
Real mailbox checks over SMTP, and nothing is sent to the address. Sign in with Google and your first 100 email checks are free, no card. Plans for bigger lists are on the pricing page.