Skip to main content
L
Loopaloo
Buy Us a Coffee
All ToolsImage ProcessingAudio ProcessingVideo ProcessingDocument & TextPDF ToolsCSV & Data AnalysisConverters & EncodersWeb ToolsMath & ScienceGames
Guides & BlogAboutContact
Buy Us a Coffee
L
Loopaloo

Free online tools for developers, designers, and content creators. Your files are processed in your browser and are never uploaded - no accounts required. A few network utilities (like What's My IP and Currency Converter) call public APIs to do their job and say so on their pages.

support@loopaloo.com

Tool Categories

  • Image Tools
  • Audio Tools
  • Video Tools
  • Document & Text
  • PDF Tools
  • CSV & Data
  • Converters
  • Web Tools
  • Math & Science
  • Games

Company

  • About Us
  • Contact
  • Blog
  • FAQ

Legal

  • Privacy Policy
  • Terms of Service
  • Disclaimer

Support

Buy Us a Coffee

© 2026 Loopaloo. All rights reserved. Built with privacy in mind.

Privacy|Terms|Disclaimer
  1. Home
  2. CSV & Data Analysis
  3. CSV Duplicate Remover
Add to favorites

CSV Duplicate Remover

Remove duplicate rows with equality as a stated choice: case, spaces, accents and numbers each their own switch, and the rule in force shown

Rows never leave your deviceMore csv & data analysisJump to full guide

Initializing in your browser…

You might also like

CSV Formatter & Validator

Format and validate against RFC 4180 by section, with output verified by reading it back

CSV File Comparator

Diff two CSV files with the matching rule stated: a key that may repeat, or a real Myers diff, with every row accounted for

CSV Viewer & Editor

View, sort and edit a CSV, with an undo stack that goes back exactly one step and a parse report that tells a broken quote from a ragged row

A sample run

A mailing list merged from several sources has the same address written three ways.

Input

Ann@Example.com  ·  ann@example.com  ·  "ann@example.com "
bob@example.com  ·  carl@example.com  ·  bob@example.com
What CSV Duplicate Remover produces

Under three rules

identical only        1 group,  1 row removed, 5 kept
ignoring case         2 groups, 2 rows removed, 4 kept
ignoring case+spaces  2 groups, 3 rows removed, 3 kept

The same six rows give three different answers, which is why the rule has to be stated rather than buried in a mode name. The tool writes the one in force out in sentences: which normalisations apply, that the first row of each group survives, and that a shorter row is compared as if its missing fields were empty.

Deduplication Where Equality Is a Stated Choice

Find and remove duplicate rows, having first said what "duplicate" means. Case, surrounding spaces, repeated spaces inside a value, accents written two ways, and 1 against 1.0 are five separate decisions, and this tool makes each one a switch rather than burying them in a mode name.

How to use

  1. 1Upload your CSV file, or load the sample
  2. 2Choose whether to compare all columns or specific ones
  3. 3Tick the rules that should count as the same value; the tool writes out what you have chosen
  4. 4Choose whether the first row, the last row, or none of a duplicate group survives
  5. 5Preview the groups, then remove and download

Key features

  • Five independent equality switches: surrounding spaces, repeated inner spaces, case, accents, and numbers
  • A row key that is a structure, so a value containing the separator cannot collide with a different row
  • Case folding in the Unicode sense, so the German sharp s matches SS
  • NFC normalisation, so the two spellings of an accented letter match
  • Numeric comparison, so 1, 1.0, +1 and 007 can be the same value when you want them to be
  • The rule in force written out in plain sentences, including how a short row is compared
  • Keep the first row, the last row, or remove every row in a duplicate group
  • Compare all columns or a chosen subset
  • A fuzzy mode for similarity, kept separate because it is a different question from equality
  • A preview of every group before anything is removed, with individual rows excludable
  • One pass over the file: 50,000 rows in about 27 milliseconds

How it works

The entire job of a duplicate remover is one question nobody states: what counts as the same. Measured on 2026-09-01 against a corpus of 20 row pairs, each with the answer recorded under eight rule sets and cross-checked against a second implementation, the previous version of this tool was right on 54 of 60. Three of the six failures came from a single structural fault.

The key for a row was the compared fields joined with a pipe character. That is not a key, it is a hash with obvious collisions: the row ["a|b", "c"] and the row ["a", "b|c"] both join to "a|b|c", so two genuinely different rows were reported as duplicates of each other and one of them was deleted. Any separator has the same problem with a value that contains it. The key is a structure now, so the field boundaries survive and no separator can be smuggled in.

The mode called "trimmed" also folded case. Its normaliser lower-cased, trimmed, and collapsed whitespace all at once, so choosing "trimmed" silently merged Alice with alice. Those are now three independent switches, each saying what it does with an example.

Case folding used toLowerCase, which is a case MAPPING and not the Unicode operation for caseless matching. The difference that turns up in real data is the German sharp s: STRASSE lower-cases to strasse and the sharp s does not, so the two never matched. Folding handles it, along with the ligatures and the Greek final sigma.

Nothing normalised Unicode. The word cafe with an acute accent can be written with one code point or with an e followed by a combining accent; they are the same word to a reader and different strings to a computer, macOS writes the second form and almost everything else writes the first, so a file that has been through both has visually identical rows that no amount of case folding will match. NFC normalisation is now a switch.

And nothing compared numbers as numbers, so 1 and 1.0 were never duplicates. That is a reasonable default and it was neither stated nor changeable; it is now a switch, and turning it on also makes 007 and 7 the same value, which is exactly why it has to be a choice rather than a default.

Whatever you choose, the tool writes out the rule in force in plain sentences: which normalisations apply, which row of each group survives, and that a row shorter than the others is compared as if its missing fields were empty. The scan is one pass over the rows, so 50,000 rows take about 27 milliseconds.

Where this fits a data pipeline

  • Merging mailing lists

    Turn on case folding and space trimming so "Ann@Example.com" and "ann@example.com " are one person, and see exactly which rule made them match.

  • Cleaning data that has been through a Mac

    Turn on accent normalisation to catch rows that look identical and are not, because one system wrote a precomposed letter and another wrote a combining accent.

  • Deduplicating on a numeric key

    Turn on numeric comparison so 1 and 1.0 are the same reference, and note that 007 and 7 then are too, which is why it is a choice.

  • Auditing before deleting

    Preview every group with the rule that produced it written out, and exclude individual rows from removal before committing.

Frequently asked questions

What counts as a duplicate?

Whatever you say. By default two rows are duplicates only when the compared fields are character for character identical. Each of the five switches relaxes that in one specific way, and the tool writes the resulting rule out in sentences so it is never a guess.

Why is "Ignore case" separate from "Ignore surrounding spaces"?

Because they are different questions, and combining them is how the previous version merged Alice with alice for someone who had only asked to ignore trailing spaces. Every switch does one thing.

My two rows look identical but are not matched. Why?

Most likely the accents. A letter with an accent can be written as one code point or as the plain letter followed by a combining accent, and the two are different strings. Turn on accent normalisation. If the values contain the German sharp s, case folding handles that too.

Are 1 and 1.0 duplicates?

Only if you turn on numeric comparison. It is off by default because it also makes 007 and 7 the same value, and a zero-padded code is usually meant to be distinct.

Which row survives?

The first of each group by default, in file order. You can keep the last instead, or remove every row in a group when the presence of a duplicate means neither copy is trustworthy. The choice is stated alongside the results.

What happens to a row with fewer fields than the others?

Its missing fields are compared as empty, which the tool says explicitly. A row of ["Alice"] and a row of ["Alice", ""] are therefore the same row.

Related tools and how they differ

  • CSV Merger: Use first to stack several CSVs into one file (append rows or merge columns side by side); then come back here to dedupe the combined result.

Private by design

Rows and columns are parsed and transformed in memory in your browser. No record ever reaches a server.