Skip to content
FormatKit

Free online CSV table viewer

CSV viewer that reads the quotes properly

This CSV viewer is free and needs no signup: drop a delimited file of up to 5 MB and you get a sortable, searchable table, with the separator, the quote character and the header row worked out from the first lines. Commas and line breaks inside quoted fields stay where they belong, because the parser tracks quoting instead of splitting on punctuation, and any row whose field count disagrees with the rest is shaded so you can see the damage. Only the rows in view are drawn, so a 60,000-row export scrolls without the tab stalling.

  • 100% free
  • No signup
  • Up to 5 MB
  • Delimiter detected
  • Sortable columns

The table appears here. Paste rows, drop a file, or press Ctrl+V.

Drop a file on the box above, or press Ctrl+V while this page has focus. The delimiter, the quote character and the header row are worked out from the first lines.

How to open a CSV file as a table

Open it, confirm the three guesses, then sort your way to the row that matters.

  1. Drop the file in

    Paste the rows, drag a file onto the box, or use Open file; Ctrl+V works wherever the cursor happens to be, ⌘V on macOS. Comma, semicolon, tab and pipe files all open — .csv, .tsv, .psv, .dat and .txt up to 5 MB — and a UTF-8 byte-order mark is stripped rather than turning your first column name into a mystery.

  2. Check the three guesses in the toolbar

    The separator, the quote character and whether row one holds column names are worked out from the first 64 KB and shown in the menus that set them. Each is a guess a file format cannot confirm, so each has an override: pick semicolon if a German export opened as one column, or switch First row to Data if your file starts straight in on the numbers.

  3. Sort, search and spot the broken rows

    Click a column heading to sort ascending, again for descending, a third time for file order; numeric columns sort as numbers, including 1.234,56 written the European way. The search box filters to rows containing your text anywhere. Rows whose field count differs from the rest are shaded amber with the count in their tooltip, and Copy as TSV puts whatever is currently on screen onto the clipboard for a spreadsheet.

Technical specifications

Separators detectedComma, semicolon, tab and pipe, chosen by parsing the first 64 KB with each and keeping the one with the most consistent field count; overridable from the toolbar
QuotingRFC 4180 double quotes with "" as the escape, plus single quotes when a file consistently uses them; commas and line breaks inside quotes are kept in the field
Header detectionRow one is treated as column names when its cells are unique, non-empty and non-numeric above columns that are not; otherwise columns are labelled A, B, C
SortingPer column, ascending then descending then back to file order; numeric, currency and ISO-date cells sort by value, including 1.234,56 in European notation
Size ceiling5 MB (5,242,880 bytes) — about 60,000 rows, parsed in roughly 90 milliseconds
RenderingOnly the rows in the scroll window are in the DOM, at a fixed 30 pixels each, with spacer rows standing in for the rest
Reported per fileRow and column counts, quoted fields, line breaks inside quotes, doubled quotes, blank rows skipped, byte-order mark, line-ending style and every ragged row
Cost and processingFree, no signup, no row cap beyond the file size; the file is read and parsed inside this browser tab

Frequently asked questions

Why does my CSV break on a comma inside a value?

Because the value needed quotes around it, and something split the line on commas without checking for them. RFC 4180 says a field containing a comma, a double quote or a line break must be enclosed in double quotes — so "Doe, Jane" is one field and Doe, Jane is two. A parser that walks the line character by character, tracking whether it is inside a quoted field, gets this right; text.split(",") never can. This viewer does the former, which is why the sample file above keeps its comma-bearing names in a single column.

Why did my file open as one column, and why does it use semicolons?

Because Excel writes CSV with the list separator of the machine's locale, and in most of continental Europe that is a semicolon. The reason is the decimal mark: where 1.234,56 is written with a comma, a comma cannot also separate fields without ruining every number. The same file therefore looks like one column to a comma parser and correct to a semicolon one. The detector here parses a sample with each of the four candidates and keeps whichever produces the same field count on the most rows, which usually settles it without you touching the menu.

Can a single CSV field contain a line break?

Yes, as long as the field is quoted — RFC 4180 explicitly allows a line break inside quotes, and a shipping note or an address usually needs one. The consequence catches people out downstream rather than here: a row is no longer a line, so wc -l over-counts your records, split -l can cut a file in the middle of a value, and reading with readline() hands you half a row. Any embedded break is shown as an arrow inside the cell and counted under the table.

How do I put a double quote inside a quoted field?

You write it twice: ""before noon"" inside the field becomes "before noon" in the data. That doubling is the whole of CSV's escaping mechanism — there is no backslash escape, and adding one produces a literal backslash in the value. Files written by hand often get this wrong and end up with an odd number of quotes on a line, which is what turns a single field into a runaway that swallows the rest of the file. The table reports that case as an unterminated quote with the row it started on.

Why do some of my rows have more fields than the header?

Because a delimiter got into a value without quotes around it, and every field after it shifted along by one. That is what the amber rows in this table are: their field count differs from the count the rest of the file agrees on, and the tooltip on the row number says how many they have. A row that is one field long is the same fault seen from the other side — a quote opened earlier and has not closed yet, so several physical lines have merged into one record.

Is the first row always the column names?

No, and nothing in the file can tell you. RFC 4180 makes the header optional and puts the flag outside the data entirely, in a MIME type parameter — text/csv; header=present — that almost nothing sets and no file on disk carries at all. Any tool that shows you column names is guessing, and this one guesses by looking for a first row of short unique non-numeric labels sitting above columns that are mostly numbers or dates. When the guess is wrong, the First row menu overrides it and the table redraws with generic A, B, C headings.

How large a file can this open without the tab freezing?

5 MB, roughly 60,000 rows of typical order data, and the size that matters is what gets drawn rather than what gets parsed. Parsing is one linear pass over the characters and takes about 90 milliseconds at that size; the table then renders only the thirty or so rows inside the scroll window plus a small overscan, with two spacer rows standing in for everything above and below. Sorting and searching work over the parsed rows rather than the DOM, so both stay instant while the browser is only ever holding a screenful of cells.

About CSV, and why no two files agree

CSV was never standardised into existence — RFC 4180 arrived in October 2005 to write down what people were already doing, and it is Informational rather than a standard for exactly that reason. It settles the important part: fields separated by commas, records ended by CRLF, an optional header line, and a field enclosed in double quotes whenever it contains a comma, a quote or a line break, with an embedded quote written twice. Read those rules once and the whole class of “my file broke on a comma” problems turns into a single sentence: the value was quoted and something split on punctuation anyway. Everything on this page follows from taking the quoting seriously.

What the RFC could not settle is everything around the edges, and that is where real files differ. The separator follows the locale, because Excel writes the operating system list separator and a country that uses a comma for the decimal mark cannot also use it between fields — so a German or Brazilian export arrives full of semicolons and opens as one column anywhere that assumes otherwise. The header is optional and its presence is signalled by a header=present parameter on the MIME type, which is to say nowhere at all once the file is on disk. Line endings are CRLF in the RFC and LF everywhere Unix touched them. And Excel writes a UTF-8 byte-order mark that turns the first column name into something with an invisible character in front of it unless the reader strips it.

The trap with the longest reach is the line break inside a quoted field, because it breaks the assumption every line-oriented tool is built on. Once a record can span several lines, wc -l stops counting records, split -l can cut a file in the middle of an address, and a naive importer produces ragged rows that look like corrupted data rather than a quoting problem. Seeing them in a grid is usually enough to tell which of the two it is — and once the shape is confirmed, the same file can go on to an array of JSON objects or to a real spreadsheet with typed cells, where long numeric IDs stop turning into scientific notation.

What happens to the file you open

No row leaves the machine. Opening a file hands it straight to JavaScript running in this tab, and nothing about its contents is sent, cached or written down anywhere — which is what makes it reasonable to look at a customer extract or a finance export in a browser at all. There is no history to clear afterwards: the parsed table lives in the page and goes when the page does.