TSV Validator
Check that every non-empty TSV row has the same number of tab-separated fields as the first row.
🔒 Processed entirely in your browser — nothing you enter here is ever uploaded.
The result appears on this page after you run the tool. Nothing you enter is uploaded.
Result
About this tool
Paste tab-separated text. The scanner splits the paste on newline and walks each line. A final line that is empty after trimming is ignored, so a trailing newline does not become an extra row. Every earlier line is a row, including a blank line in the middle. The first row that is actually parsed sets the expected column count. A later row with a different count fails with Row column count mismatch, the expected count, the found count, and the 1-based line number. A paste that is empty after trimming fails with Data payload is empty.
Fields are split on the tab character only while the scanner is outside quotes. A double-quote character toggles that mode and is not kept in the field. A tab between an opening quote and its closing quote stays inside the field. This is not the RFC 4180 rule. A doubled quote is not an escape: each quote character just flips the mode. An odd number of quotes on the line fails with Mismatched quotes. Quoted string field was not closed, and the line number. Single quotes are ordinary characters. The scanner does not understand a header row as names. Column 1 of row 1 is just the first field.
A passing file ends with Data syntax is valid! Total parsed rows: N, Columns: M. N counts lines that are not empty after trimming. M is the column count taken from the first parsed row. Two lines, a tab between name and score, then a tab between Ada and 10, report 2 rows and 2 columns. A second data line with no tab, when the first line had one, is the mismatch error on that line. The page does not convert the TSV to a table, JSON, or a spreadsheet. The CSV page is the same scanner with a comma instead of a tab. There is no type check. A field that looks like a number is still text. Duplicate header names are not an error. A row of the right width with empty fields is valid, because an empty field is still a field. The quote toggle is the limit to remember: a stray quotation mark changes where the tabs are counted, and the error you then see may be a column mismatch or an unclosed quote rather than a note about that character. The paste stays in the browser. A header of two fields and a data row of two fields is the whole test the success line is describing. It does not check that a column stays numeric from row to row.
Example. A header name and score separated by a tab, then Ada and 10 separated by a tab, passes as Data syntax is valid! Total parsed rows: 2, Columns: 2. A second row with no tab fails the column count on that line.
Limit. Quotes toggle a mode and are not an RFC 4180 escape. A blank line in the middle is a row. The page does not turn the TSV into a table or JSON.
What does a valid two-column file report?
Data syntax is valid! Total parsed rows: 2, Columns: 2, when you paste a header and one data row and both contain one tab. The row count ignores a final empty line. It does not ignore a blank line between the two rows.
How are quotation marks handled?
A double quote flips whether tabs split fields, and the quote itself is dropped from the value. It is not the RFC 4180 doubled-quote escape. An odd number of quotes on a line fails with Mismatched quotes and the line number. Single quotes are just characters.
Does the first row have to be a header?
No. The first parsed row only supplies the column count. Its fields are not treated as names, and a repeated name is not an error. Every later row has to have that same count.
Is this the CSV checker with a different separator?
The scanner is the same function. This page passes a tab. The CSV page passes a comma. A comma inside a TSV field does not split the field. A tab does, unless a quote has turned splitting off.