Payload Validator

Payload Validator / CSV

Validate CSV

RFC 4180 scanning with the delimiter sniffed from the header. Ragged rows are reported per row with both field counts, because that is the entire answer.

Up to 6,000 characters here, because this form puts the payload in the URL. For anything larger, POST it to the API — the limit there is 1 MB. Nothing is stored either way.

Valid CSV

0 errors, 1 warning

bytes:
29
rows:
2
columns:
3
fields:
6
quoted fields:
0
delimiter:
comma
line ending:
LF

1 finding

What goes wrong in CSV

A row with the wrong number of fields loads without complaint

name,city
Smith, John,Leeds

The name contains an unquoted comma, so that row has three fields against a two-field header. pandas pads or throws depending on the engine, Excel shifts the columns, and split(",") mis-assigns every field after the extra one. Nothing errors, and nobody notices until a number is wrong in a report. Quote the field: "Smith, John".

csv.ragged_row · run this example

A European CSV read as comma-separated is one column of nonsense

name;price
widget;1,50

Wherever the comma is the decimal separator, CSV exports are semicolon-separated. Read as comma-separated, the file has one column and every value is wrong — with no error at all. The delimiter is sniffed from the header, ignoring quoted regions, and always reported so the assumption is visible.

csv.ambiguous_delimiter · run this example

One unclosed quote makes thousands of rows look broken

a,b
"never closed,2
3,4

An unclosed quote swallows the remainder of the file into a single field. The symptom is thousands of ragged rows and a row count far lower than the file length suggests. Fix the quote first and re-validate; the rest usually resolves.

csv.unterminated_quote · run this example

A BOM makes the first column impossible to look up

id,name
1,gumball

The BOM becomes part of the first header name, so the column is called "\ufeffid" and a lookup for "id" returns nothing — while the two print identically. Excel adds this when saving as CSV UTF-8. In Python, read with encoding="utf-8-sig".

csv.byte_order_mark · run this example

Two columns with the same name, resolved differently everywhere

id,name,id
1,gumball,2

pandas renames the second to "id.1", csv.DictReader keeps only the last, and a hand-written mapper silently overwrites. Position-based readers are unaffected, which is exactly why this survives testing and fails in the one consumer that addresses columns by name.

csv.duplicate_column_name · run this example

A column name with a leading space

id, name,city
1,gumball,Leeds

Most parsers keep the space, so the column is " name" and a lookup for "name" misses it. Indistinguishable on screen from the correct file.

csv.padded_column_name · run this example

Call it instead of pasting

curl --data-binary @your-file \
  'https://payload-validator.gumballtools.com/api/v1/validate?format=csv'

API and MCP setup — the MCP tool is validate_csv.

Other formats