{{ summaryTitle }}

{{ summaryValue }}

{{ summaryLine }}

{{ badge.label }} {{ badge.value }}

{{ primaryCopyAnnouncement }}

CSV comparison sources and matching rules
Auto resolves each source independently and reports both resolved delimiters in the result.
Original and updated sources:
{{ sourceAFile ? sourceAFile.name : 'Drop source A or browse' }} CSV, TSV, or text · up to 1 MiB {{ sourceAFile ? formatFileStatus(sourceAFile) : 'Pasted sample is active' }}
The selected file takes precedence until “Use pasted text” is chosen.
{{ sourceBFile ? sourceBFile.name : 'Drop source B or browse' }} CSV, TSV, or text · up to 1 MiB {{ sourceBFile ? formatFileStatus(sourceBFile) : 'Pasted sample is active' }}
The selected file takes precedence until “Use pasted text” is chosen.
Enter exact header names separated by commas, such as account_id, period.

Comparison runs in this browser tab. Source data is not uploaded or query-shared.

{{ workflowMessage }}

The neutral default hides unchanged rows on screen without changing the comparison or exports.
{{ include_unchanged ? 'Included on screen' : 'Hidden on screen' }}
{{ primaryCopyAnnouncement }}
{{ row.label }}{{ row.display }}

{{ computation.values.artifact_text }}

Review guidance

{{ reviewToneLabel }}

{{ reviewGuidance }}

Schema findings

  • {{ finding }}

The compared schemas have the same columns in the same order.

{{ chartExportStatus }}

The chart renderer is unavailable. The same counts remain available in the comparison brief and evidence ledger.

{{ ledgerExportStatus }}
StatusKeyRows A → BColumnBeforeAfterEvidenceCopy
{{ statusLabel(row.status) }}{{ row.key || '—' }}{{ row.source_a_row || '—' }} → {{ row.source_b_row || '—' }}{{ row.column || '—' }}{{ row.before || '—' }}{{ row.after || '—' }}{{ row.detail || '—' }}

{{ hiddenLedgerCount }} unchanged row{{ hiddenLedgerCount === 1 ? '' : 's' }} hidden on screen. Exports retain the complete evidence ledger.

Introduction:

Two exports can contain the same business records without looking identical. Columns may move, a new field may appear, numeric text may gain trailing zeros, timestamps may use different offsets, or rows may arrive in a different order. A useful CSV comparison has to separate harmless representation changes from changes to the records themselves.

Reliable reconciliation starts with a key. A customer ID may identify one row, while a monthly ledger may need a composite key such as account ID plus period. Keys connect the same record across both sources even when row order changes. Blank keys cannot identify anything, and duplicate keys make one-to-one matching ambiguous, so they should remain visible rather than being paired by guesswork.

Schema change
A column was added, removed, or moved relative to the other source.
Added or removed row
A unique key appears in only the updated or original source.
Changed field
The same unique key exists in both sources, but a shared non-key value differs under the selected matching rules.
Duplicate or rejected row
A key is repeated, blank, null-like, or the record cannot be parsed safely enough for matching.

Literal text comparison is appropriate when formatting is part of the requirement. Normalized matching is better when 10, 10.0, and 1e1 should count as the same number, or when equivalent ISO timestamps should compare as the same instant. Normalization must be chosen deliberately because trimming spaces, ignoring letter case, or treating blank and NULL as equal can also hide a meaningful source-system difference.

CSV is a family of delimited-text conventions rather than one perfectly uniform file shape. Delimiter, quote character, header presence, and character encoding all affect parsing before any row can be compared. Confirm those choices first; otherwise a clean-looking report may be comparing the wrong columns or damaged text.

How to Use This Tool:

Treat Source A as the original export and Source B as the updated export, then choose rules that match the data contract.

  1. Upload or paste both sources. Each file or text source may contain up to 1 MiB, 20,000 records, 100 columns, and 500,000 cells.
  2. Set Source delimiter, Headers, Quote character, and File encoding. Auto delimiter detection resolves each source independently; pasted text is already decoded.
  3. Enter exact Key columns, separated by commas for a composite key. In headerless mode, use generated names such as column_1.
  4. Choose Value matching. Use strict for literal text, normalized for trimmed numeric, null, and ISO-date equivalence, or normalized plus case-insensitive text.
  5. Run Compare sources. If a key column is missing, an encoding is invalid, or a row has the wrong field count, correct the named source and run again.
  6. Review schema findings, change counts, duplicate groups, rejected rows, and field-level evidence before acting. Showing unchanged records affects only the on-screen ledger, not the comparison.

Interpreting Results:

Changed, added, and removed counts describe unique-key records. Changed fields count individual shared columns whose normalized values differ. Schema rows are reported separately, so an added column does not automatically make every matched record a changed row.

Duplicate-key groups and rejected rows need human review before totals are treated as a complete reconciliation. No match is guessed when either side contains more than one record for a normalized key. A zero changed-row count can therefore coexist with unresolved duplicate or rejected records.

  • Check resolved delimiters and schema changes before trusting row counts.
  • Inspect the exact before and after values for changed fields, especially when strict and normalized profiles disagree.
  • Resolve every blank key, duplicate group, parse rejection, and unexpected schema change before using the report as proof that two systems agree.

Technical Details:

Each source is decoded and parsed before matching. Auto detection tests comma, tab, semicolon, and pipe delimiters and chooses the best consistent record shape for each source. Quoted fields may contain delimiters and line breaks; a quote inside a quoted field is represented by a doubled quote. Every data row must resolve to the same number of fields as the header or generated header row.

Transformation Core:

CSV comparison transformation stages
StageOperationFailure or boundary
DecodeRead UTF-8, UTF-16LE, UTF-16BE, or Windows-1252 files with strict error handlingA byte sequence invalid for the selected encoding stops the comparison
ParseSplit records and fields using the selected delimiter, quote rule, and header modeUnclosed quotes, inconsistent field counts, duplicate headers, and size limits are reported
NormalizeApply the chosen whitespace, case, null, decimal, and ISO-date rules to keys and shared valuesOnly recognized complete decimal and date forms are canonicalized
IndexBuild one group per normalized key for each sourceBlank or null-like keys are rejected; repeated keys remain duplicate groups
CompareClassify unique keys and compare shared non-key columnsNo field comparison is guessed for duplicate groups

Rule Core:

Key-aware CSV reconciliation rules
ConditionReported status
Key exists only in Source BAdded
Key exists only in Source ARemoved
Exactly one row per side and all shared non-key values are equivalentUnchanged
Exactly one row per side and at least one shared non-key value differsChanged, with one evidence row per changed field
Either side contains more than one row for the normalized keyDuplicate, with row numbers from both sources
A key cell is blank or null-like after normalizationRejected

Normalized decimal matching removes insignificant leading and trailing zeros and accounts for scientific notation, so 10.00 and 1e1 compare equally. Date matching accepts valid ISO calendar dates and timezone-bearing timestamps; timestamps are reduced to the same instant before comparison. Strict matching leaves cell text untouched, including spaces, case, number formatting, and date representation.

Spreadsheet-directed values beginning with =, +, @, or − are prefixed with an apostrophe when written to the evidence CSV. This reduces formula execution risk when the report is opened in spreadsheet software, while leaving the on-page before and after evidence readable.

Privacy and Limits:

Files and pasted text are decoded and compared in the current browser tab; source data is not uploaded or placed in the query string. Treat downloaded reports and copied rows as new copies of the source information.

  • The comparison is key-based, not a fuzzy matcher. Misspellings or changed identifiers appear as removed and added records unless the chosen key remains stable.
  • Normalized equality can hide formatting differences by design. Use strict matching when spaces, capitalization, numeric spelling, or timestamp text is significant.
  • The evidence ledger is limited to 50,000 rows and its generated CSV to 8 MiB; narrow oversized comparisons before rerunning.
  • Protect sensitive exports according to their data classification, including clipboard history, downloads, and any later spreadsheet copies.

Worked Examples:

Reordered export with one changed customer

Source B may move the name column, add a region column, spell 10.00 as 10, rename Bob to Bobby, and add customer 3. With id as the key and normalized matching, the report marks the schema addition and reorder, keeps customer 1 unchanged, records one changed name for customer 2, and reports customer 3 as added.

Composite key with duplicates

Using account plus period as the key keeps monthly records distinct. If Source A contains two rows for account A in 2026-01, that key is reported as a duplicate group even when Source B has one matching row. A row with a blank account is rejected, so neither ambiguity is hidden inside changed or unchanged totals.