What the CSV Data Quality Checker does
This checker applies explicit rules to a CSV - required, unique, type, numeric range, length, allowed values, pattern, comparisons between columns, stray spaces, formula prefixes and duplicate rows - and reports a score for each rule plus the exact rows that fail, which you can download. It never edits the file: it tells you what is wrong and where, so the fix happens in the system that produced the data.
Rules are plain data you can save as JSON and run again next week on the next export. Everything happens in your browser tab.
How to use it
- Drop, choose or paste the CSV. The column list for the rule builder fills in from the header row.
- Add rules: pick a column, a rule and its parameter - for example Numeric range with
0..120, Allowed values withbronze, silver, gold, or Compared with column with< check_out. Or choose Suggest from data to draft required, type and unique rules from a quick profile. - Select Check data. If you have not added any rules, suggested ones are used and the report says so.
- Read the headline - the share of rows passing every rule - then the per-rule scores and examples with their file line numbers.
- Download the failing rows as a CSV (with the line number and the rules each row broke), the report as Markdown, or the rules as JSON to reuse.
Reading the results
Each rule's score is passing values divided by checked values. The headline is stricter: a row counts as passing only when it breaks no rule at all, so one bad column can pull it down sharply.
Nulls are failed only by the Required rule. A range or type rule skips empty cells, so a missing age is counted once, as missing, rather than three times.
The Unique rule marks every occurrence of a repeated value, including the first, because the checker cannot know which copy is correct. The same applies to duplicate whole rows.
Line numbers assume one header row and count from the top of the file, so line 2 is the first data row. A quoted field containing a line break makes later file lines differ from spreadsheet row numbers.
Worked example: nine rules on a ten-row customer list
Load the Customer list example: ten customers and nine rules. Customer C003 appears twice, so the unique rule fails 2 of 10 values. ben@example has no dot in its domain and fails the email type rule; C004 has no email at all and fails Required instead - not both.
Ages 131 and -4 break the 0..120 range (2 failures), Eve Park has a leading space, platinum is not an allowed tier, and one note begins =HYPERLINK(, which a spreadsheet would treat as a formula.
Seven rows break at least one rule; lines 2, 10 and 11 are clean, so 3 of 10 rows - 30.0% - pass every rule, even though no individual rule scores below 80%. That gap is the point of showing both figures.
Which rules to start with
The usual data quality dimensions are completeness (Required), uniqueness (Unique, duplicate rows), validity (type, range, length, allowed values, pattern) and consistency (comparisons between columns, such as a start date before an end date). These names are a widely used convention rather than a formal standard; they are useful because each points at a different cause upstream.
Start with the rules the next system depends on. If a database will reject a row without a customer ID, Required on that column matters more than a tidy phone format. Add stricter rules once the basic ones pass.
Formula prefixes and why they are a security rule
A cell that begins with =, +, - or @ can be interpreted as a formula when the file is opened in a spreadsheet. OWASP calls this CSV injection: a value typed into a web form can end up running a formula on the machine of whoever opens the export. The No formula prefix rule flags those cells, but ignores plain numbers such as -12.5.
When this page writes a CSV - the failing rows download, for instance - any such cell is prefixed with an apostrophe so a spreadsheet shows it as text.
Limitations: what the result does not prove
- Passing every rule proves only that the rules you wrote hold. A valid email address can still belong to someone else, and an age of 34 can still be wrong.
- Patterns are JavaScript regular expressions. A badly written one can be very slow, so checking stops after 8 seconds with a message rather than freezing the tab.
- Comparisons treat values as numbers when both sides are numbers, as dates when both are ISO dates, and otherwise as text. Local date formats such as
01/06/2024are compared as text and give misleading results. - Files are limited to 50 MB and 200,000 rows. Larger datasets belong in a database or a data quality framework that can run where the data lives.
Privacy: where your data goes
Everything you paste, type or drop is processed in this browser tab. It is not uploaded, logged, stored or sent to analytics. Session recording and tag-manager scripts are switched off on this page.
Standards and sources
- RFC 4180 CSV - checked 19 Sep 2026
- OWASP CSV Injection - checked 19 Sep 2026
- MDN - Regular expressions in JavaScript
Frequently asked questions
How is the quality score calculated for each rule?
It is the number of values that pass the rule divided by the number checked. For Required and dataset-wide rules every row is checked; for Unique only non-empty values count. The headline score is different - the share of rows that break no rule at all.
Why does a value fail Required but not the type rule?
Empty cells and null tokens such as NA are only judged by Required. Every other rule skips them, so a single missing value is reported once, under completeness, instead of being counted as an invalid email, an out-of-range number and a wrong length as well.
Can I check that one date column is before another?
Yes. Add a Compared with column rule on the first column with a parameter such as < check_out or <= end_date. Both columns must hold ISO dates (2024-06-01) or numbers; rows where either side is empty are skipped.
What is in the failing rows download?
Every row that broke at least one rule, with its line number in the file, a list of the rules it broke, and all of its original columns. Open it next to the source to fix the data, or send it back to whoever produced the export.
Can I save my rules and reuse them on next month's export?
Download the rules as JSON, or copy them from the Rules as JSON panel. Next time paste them back and choose Use these rules. The JSON holds only rule types, column names and parameters - never any of your data.
Does the checker change or clean my file?
No. It reads and reports only. To remove duplicates or tidy values, use a cleaning tool, then run the same rules again to confirm the fix worked.
Last reviewed by the A2Z.Tools team against the sources listed above.