Before accepting a CSV migration, write down what must stay the same. A row count alone cannot tell you whether a status changed, an identifier lost its leading zero, or one record replaced another.
Here is a small, synthetic example. The source has three order lines. The destination reorders them, changes SAMPLE-002 from pending to paid, changes one amount from 9.50 to 9.505, and adds SAMPLE-003. These are invented records, not customer transactions.
Use the pair (order_id, line) as the key, not the line's physical position in the file. For this example the acceptance rules allow an absolute amount difference of 0.01, but allow no added, removed, or changed records. With those rules, reordering is harmless and 9.505 is within tolerance of 9.50. The state change and added record must fail acceptance.
The tested ExportCheck example produces: added 1, removed 0, changed 1, unchanged 2; verdict FAIL and exit status 1. That failure is the intended result, not a crash.
Five checks before accepting an export
- Choose a stable unique key, including a second column when necessary. Preserve identifiers as text.
- Check duplicate and empty keys before comparing values. Do not silently overwrite duplicates.
- State which columns may change and use an explicit decimal tolerance where appropriate. A tolerance is a business decision, not permission to ignore arbitrary differences.
- Inspect additions, deletions, schema changes, and changed fields separately.
- Keep the input fingerprints, rules, and report together so another reviewer can repeat the check. Reports can contain source data; keep real reports private.
For a tiny one-time file, a spreadsheet or short script may be sufficient. ExportCheck is intended for repeating the same checks with a versioned JSON profile and saving HTML, CSV, and JSON evidence. It runs locally, makes no runtime network or AI calls, and does not repair data. It supports UTF-8 CSV, not XLSX or fuzzy matching; macOS/Python 3.14 and Ubuntu 24.04 x86_64/Python 3.12.3 are tested; Windows remains unverified. It is not a certified financial audit.
Disclosure: this is material from the ExportCheck project, prepared with AI assistance. The example was executed locally on 2026-10-15. It demonstrates behavior, not market demand or customer success. The product is available with a one-time single-user commercial licence.