Compare two lists
Find what is in one list and not the other. Order is ignored entirely — this is a set comparison, not a line diff.
List comparison
A set question, not a diff question
The text diff on this site answers "how do I turn this document into that one", and to do that it has to care about position — a line that moved is a line that was deleted here and inserted there. That is exactly right for comparing two versions of a file and exactly wrong for comparing two lists, where the order is usually an accident of however each one was exported.
This page throws position away and asks three set questions instead: what is in A only, what is in B only, and what is in both. Paste the same thousand entries into each box in completely different orders and it will tell you they are identical, which is the answer you wanted.
What this is actually for
- Reconciling two exports. Which customers are in the billing system but not in the CRM, and which are in neither.
- Checking a migration. Every ID that existed before should exist after; "only in A" should be empty when you are done.
- Cleaning a mailing list. Which addresses on the new list are already subscribed, and which are genuinely new.
- Finding duplicates. Paste a list into A alone and the duplicates count tells you whether it contains repeats, without needing a spreadsheet formula.
The whitespace trap
By far the most common reason two entries that look identical are reported as different is that one of them has a trailing space. Spreadsheet exports are full of them, and they are invisible in every interface you would use to look at the data. Trimming is on by default for that reason, and turning it off is the right move only when you are deliberately hunting for that kind of contamination.
One kind of whitespace trimming will not save you from: a non-breaking space, the character that arrives when text is copied out of a web page or a PDF. It looks exactly like a space and is a different character, so entries containing one will still show as different. If two entries look identical, trimming is on, and they still will not match, that is very often what has happened.
Duplicates and counts
An entry that appears several times within one list is listed once in the comparison, carrying its count, and is also reported in the duplicates line beneath the summary. The count distinct entries only switch changes what the two totals mean — with it off they count lines, with it on they count unique values. The difference between those two numbers is itself useful: if they disagree, the list has repeats.
Comparing structured data rather than a flat list? The JSON diff compares two objects key by key, including nested ones, and reports what was added, removed, and changed.
Common questions
How is this different from the text diff?
A text diff cares where each line sits. Two lists holding exactly the same entries in a different order come back as almost entirely changed, because a diff is answering "how do I turn this document into that one" — position is the whole point. This page ignores order completely and answers a set question instead: what is in A that is not in B, what is in B that is not in A, and what appears in both. For comparing two exports, two mailing lists, or two sets of IDs, that is the question you actually have.
How do I find items in one list but not the other?
Paste each list into its own box, one entry per line, and read the first two columns. "Only in A" is everything present in the left list and absent from the right; "only in B" is the reverse. Both are given with a count, and each column can be copied on its own, so the result is ready to paste straight back into a spreadsheet or a query. Blank lines are ignored throughout, so trailing newlines from a copy-paste do not become phantom entries.
Why are entries that look identical showing as different?
Almost always invisible whitespace or a case difference. Data exported from a spreadsheet very often carries trailing spaces, and a list of emails may be capitalised inconsistently between two systems. Both switches are on by default for that reason: trimming removes leading and trailing whitespace before comparing, and ignoring case folds the two together. If you need an exact byte-for-byte comparison, turn both off. Note that non-breaking spaces pasted from a web page are not ordinary spaces and will still differ.
What happens to duplicates within one list?
They are counted and reported separately rather than silently collapsed, because a repeated entry is often the thing you were looking for. An entry appearing three times in A shows once in the comparison with a count of three, and also appears in the duplicates row. The totals at the top can be read either way — the deduplicate switch changes whether the count of each list means "lines" or "distinct entries".
Is this case sensitive?
By default no, because the most common real inputs — email addresses, usernames, product codes — are usually meant to be compared case-insensitively, and being strict about it produces false differences that waste time. The switch is there when it matters: identifiers in case-sensitive systems, file paths on Unix, or anything where Alice and alice are genuinely two different things. The original casing is always what is displayed, whichever way the switch is set.
Does my data get uploaded?
No. The comparison runs entirely in your browser, so nothing is sent to a server, logged, or stored. That matters more here than on most pages, because the lists people compare tend to be customer emails, user IDs, and other things that should not be pasted into someone else's server. The page keeps working with the network disconnected once it has loaded.