CSV Diff and Change Report

Compare two CSV versions by a key column and report added, removed and changed rows.

Files stay on your device No sign-up Free to use
How this works

The tool runs in this browser. Your file or text is not uploaded to UseFreeTools. Check this tool's limits for anything it may save on your device.

Privacy details

Compare the versions controls

Drop your CSV file here

or choose one from your device

One UTF-8 file up to 20 MiB per table, 100,000 rows and 500 columns.

    Drop your CSV file here

    or choose one from your device

    Read with the same delimiter choice as the before table.

      The earlier version of the table. Paste it here, or leave this empty and choose a file.

      The newer version. A key that appears only here is reported as added.

      The column that identifies one row, such as an order number or email address. Enter it exactly as it appears.

      The matching column name on the newer side.

      Comparison changes only what counts as a difference; the report still shows the real values.

      A repeated key cannot be matched one to one, so the default stops and names it instead of guessing.

      A precaution for opening the report in a spreadsheet. A cell that begins with = + - or @, including after leading spaces, receives a prefix so it is less likely to run. The prefix changes the stored value, and an app can still treat the cell as a formula after a save and reopen, so it is not a guarantee.

      How to use CSV Diff and Change Report

      1. Paste the earlier table into the before box, or choose its CSV file instead.
      2. Add the newer table the same way.
      3. Name the key column on each side and choose how keys and values are compared.
      4. Select Compare the versions, read the counts, then download csv-changes.csv.

      Example: CSV Diff and Change Report

      See what changed between two exports of the same order list.

      You add
      Before table: header id,name,qty then rows 0012,Ana,2, 0013,Bo,5 and 0014,Cy,1. After table: header id,name,qty then rows 0012,Ana,2, 0013,Bea,5 and 0015,Di,7. Key column on both sides: id.
      You get
      The result reports 1 added, 1 removed, 1 changed and 1 unchanged row. The preview shows 0013 changed with name "Bo" to "Bea", 0014 removed, and 0015 added. The download csv-changes.csv holds one row per changed cell, so 0013 appears once for the name column.

      Options

      Compare keys
      Exactly as written treats a padded key as a different key, so it looks like one row removed and another added. Ignoring spaces at the ends or letter case matches the rows and then compares their values instead.
      Compare cell values
      This setting decides what counts as a difference. It never changes what the report shows: a value that differed only by letter case still appears in full, with its real text on each side.
      When a key repeats
      A repeated key cannot be matched one to one, so the default stops and names the key rather than pairing rows at random. The other setting compares only the first row of that key and reports how many rows it left out.
      Columns on only one side
      A column present in one table and missing from the other is named in the notes and left out of the value comparison. A renamed column therefore reads as one column removed and one added rather than as a change on every row.

      Supported inputs and limits

      Each side is one UTF-8 CSV or TSV source, pasted or from a file, up to 20 MiB, 100,000 rows and 500 columns. Quoted commas, quotes and line breaks inside a cell are read as part of that cell, and every value stays text, so 0012 is not compared as the number twelve. Only the columns that appear in both tables are compared value by value. The report is capped at 50,000 change rows. There is no three-way merge and no cell editing; the download is a new report, and your files are unchanged. Tables must stay within 2,000,000 cells; the preview shows a limited selection of rows.

      Where your input is processed

      This tool processes your input in this browser. Your text and files are not uploaded to UseFreeTools. Check this tool's limits for anything it may save on your device.

      A key turns a row comparison into a value comparison

      Without a key, two files can only be compared line by line, and inserting one row near the top makes every later line look changed. A key such as an order number or email address lets this page find the same record in both files and report only the values that really differ.

      One row per changed cell

      The download holds one row for each changed cell rather than one row per record, with the key, status, column name and both values. That shape is what makes a spreadsheet filter useful: sort by column to see every price change across the file, or filter to one key to review a single record's history.

      Questions about CSV Diff and Change Report

      Why does an unchanged row not appear in the report?

      The report lists what changed. Unchanged rows are counted in the summary so the totals add up, and leaving them out keeps the file short enough to read.

      Why is my renamed column treated as a removal and an addition?

      The comparison matches columns by name. A renamed column is not found on the other side, so it is reported in the notes as present on one side only, and the remaining shared columns are still compared.

      What does the status column hold?

      added for a key only in the newer table, removed for a key only in the earlier table, and changed when a key appears on both sides but a shared value differs. An unchanged row is counted but never listed.

      Can I compare files that use different delimiters?

      Not in one run. The single delimiter choice applies to both sides, so set it to the delimiter that both files use, or convert one file first.

      A key repeats in both files. Why was the comparison refused?

      Rows cannot be paired one to one when a key repeats, so the default stops and names the key. Choose the first-row setting to compare the first row of each key; the summary then states how many rows were left out.

      Project manager: Tony Hines · Content updated 4 October 2026 · Report a problem