CSV Viewer

Open a CSV or TSV file as a sortable, searchable table in your own browser tab. No spreadsheet app, no upload, and you can export the filtered rows.

🌐 Español

Drop your CSV or TSV file here (.csv, .tsv)

πŸ”’ Private by design: everything runs locally in your browser and never uploaded to any server.

Opening a file and reading the strip above the table

  1. Drop a .csv or .tsv file onto the box above, or click Choose a file and pick one. Nothing is sent anywhere; the file is read straight off your disk.
  2. Check the summary strip that replaces the dropzone. It shows the file name and size, the row and column count, and the separator that was detected, written out as Comma, Semicolon or Tab.
  3. Click any column heading to sort by it. A second click on the same heading reverses the order and a third click drops back to the file’s original row order. A small triangle marks the sorted column.
  4. Type in the search box to keep only the rows containing that text. Leave the dropdown next to it on All columns, or pick one column to search inside just that one.
  5. Click Download visible rows as CSV to save what is currently on screen, or Load another file to start again with a different file.

The row counter between the search box and the download button always reads as a fraction, so you can see at a glance how much a search has narrowed things down.

Delimiter detection, and the semicolon exports Excel makes in Europe

A .csv file is not reliably comma-separated. Export the same sheet on a machine set to a locale where the comma is the decimal mark and you get semicolons, with the same extension and no warning. Tab-separated exports show up with a .csv name often enough too.

So the separator is worked out before parsing rather than assumed. A short sample from the front of the file is taken, up to the first ten non-empty lines, and comma, semicolon and tab are each counted on every one of those lines. Crucially the count ignores anything inside a quoted field, so a "Last, First" name column in a semicolon-separated file does not make commas look like the separator. A candidate has to appear at least once on every sampled line to be considered at all. Candidates with an identical count on every line beat the rest, since a constant count is what a real field separator looks like, and among equals the most frequent one wins with the comma taking a tie. When nothing qualifies, which is what happens with a genuine single-column file, it falls back to the comma.

The winner is then handed to the parser explicitly, so the parser never has to guess for itself. Quoted fields are handled properly at that stage: a field can hold the separator, a line break in the middle of it, or a doubled quote mark standing in for one literal quote, and it still counts as one cell of one row.

Sorting that knows 2 comes before 10

The classic annoyance with quick table viewers is a numeric column sorted as text, where 10 and 100 crowd in ahead of 2. A cell counts as numeric here only when the whole trimmed value is a plain number, optionally negative, optionally with a decimal point. If both cells being compared pass that test they are compared as numbers. If only one does, the numeric one comes first in ascending order, which keeps a column of amounts contaminated by a stray β€œn/a” from scattering. Everything else falls back to a case-insensitive comparison.

Two honest limitations. Thousands separators and scientific notation are not recognised as numeric, so 1,234 sorts as text. And dates are not understood as dates at all, so an ISO 2026-03-09 sorts correctly by luck (its text order matches its date order) while 09/03/2026 does not.

Search, then export what is left

Search is a plain case-insensitive substring match, not a query language, and it runs before sorting rather than after. That ordering matters more than it sounds: narrowing to one region and then sorting by revenue gives you that region ranked, instead of a ranking of everything with some rows hidden.

The download button captures exactly that state. It writes the header row plus every row that survived your search, in the order shown, as standard comma-separated text, and names the file after your original with -filtered on the end. Scroll position makes no difference, so rows scrolled out of view are still included. Trimming a huge export down to the handful of rows you actually need, then saving just those, is the single most useful thing this page does. From there the smaller file can go into CSV to SQL as INSERT statements, or into the Chart Maker if the point was to show someone the shape of the data.

Rendering only the rows on screen

Handing a browser a table element with tens of thousands of rows in it is what makes most in-page viewers crawl. Here the parsed rows live in memory and only the slice inside the scroll window is actually drawn, with a small buffer above and below so fast scrolling does not flash blank. Two spacer rows of calculated height stand in for everything off-screen, which keeps the scrollbar honest about the real size of the file.

The part that is not instant is the initial parse, which happens in one pass when you drop the file. A very large file will pause for a moment before the table appears. Sorting and searching after that are fast, because they work on data already in memory.

What it will not do, and where to go instead

This is a viewer. There is no cell editing, no formulas, no adding or deleting rows, and no saving back over your file. It also only opens .csv and .tsv; an .xlsx workbook is refused, and for those the Excel to JSON converter reads the real workbook format instead. Comparing two exports row by row is a different job again, handled by Compare Excel and CSV Files, which accepts spreadsheets and delimited text alike. For a captured browser session rather than a spreadsheet, the HAR File Viewer offers the same sortable and filterable treatment for .har files. The rest of the data cluster sits on the developer tools hub.

See it in action

Screenshot of the CSV Viewer tool with a dropzone waiting for a .csv or .tsv file
CSV Viewer mid-process: a dropzone waiting for a .csv or .tsv file.
Screenshot of the CSV Viewer result screen showing the file parsed into a sortable, scrollable table with its columns detected from the header row
The finished result: the file parsed into a sortable, scrollable table with its columns detected from the header row. The download link is a local blob URL β€” the file never leaves your device.

Frequently asked questions

The strip above my table says the delimiter is a semicolon. Did it read the file correctly?

Almost certainly yes. Spreadsheet apps configured for a locale that uses the comma as a decimal separator export semicolon-separated files with a .csv extension, which is why the detection step exists at all. If the reported column count matches what you expect and the first row reads like your real headings, the file was read the way it was written.

Some rows in my file have more cells than the header row. What happens to the extras?

The table is drawn as a rectangle, so every row is padded or trimmed to the width of the header row. A short row gets empty cells appended on the right, and a row with extra cells has the surplus dropped from the right rather than being allowed to shift every later column across. Nothing is written back to your file, so this only affects what you see and what you export.

Why does my exported file come back comma-separated when the original used tabs?

The export is always written as plain comma-separated text with the quoting rules from RFC 4180, whatever separator the source used. That makes the download the safest thing to hand to another tool or reopen elsewhere. The header row is included, and any cell containing a comma or a quote mark is wrapped in quotes with its internal quotes doubled.

Can I fix a typo in a cell while I am looking at the data?

No. Cells are rendered as read-only text, and there is no editing, no formula bar and no way to write anything back to the file you opened. Sorting, searching and exporting the rows on screen are the whole feature set, which is why it loads instantly and never asks for permission to touch your file.

Does clicking a heading sort every row, or only the ones matching my search?

Only the rows still matching your search. Filtering runs first and sorting is applied to whatever survived it, so narrowing to a customer and then sorting by amount gives you that customer's rows in order rather than a reshuffle of the whole file. Clearing the search box brings the other rows back in the same sort order.

I opened a file and nothing appeared except a message. What went wrong?

Three checks run before the table is drawn, and each has its own message. A file whose name does not end in .csv or .tsv is refused outright. A file the browser cannot read off disk at all, usually because it was moved or deleted after you picked it, is reported separately. And a file that parses to no rows is reported as empty, which most often means the file really is blank. A binary file merely renamed to .csv hits none of these, since it decodes into a table of garbled characters, so nonsense rows are the sign of a rename rather than a conversion.

Related tools