CSV Viewer and Editor
Open a CSV of any size, sort and search it, fix what is wrong, and save a copy.
Runs entirely in your browser
Loading the tool…
Your file is opened by this page and never uploaded. Nothing you open is sent anywhere, however large it is, and the page keeps working with the network off.
- —Rows
- —Columns
- —Showing
- —File
Click a heading to sort by it, again to reverse, a third time to put the file back in its own order. Click any cell to edit it. Tick a row number or a column to select it, hold Shift to take a run of rows, and delete what you have selected from the bar above. The funnel in a heading filters on that column alone, and several of them narrow each other. Your file on disk is never touched: changes live in this page until you save a copy.
Drop in a CSV and read it here, in this page. Your file is not uploaded: nothing in the page sends it anywhere. Turn your connection off and it still works, which matters for the files people actually have in CSV: exports of customers, transactions, patient lists and payroll.
Size is the point. A spreadsheet gives up somewhere around a million rows and a text editor stops being usable long before that, mostly because both try to put the whole file on the screen. This does not: the file is parsed once into WebAssembly memory, and the page asks for the thirty rows it is about to draw. Scrolling a million-row file costs the same as scrolling fifty.
The separator is detected by looking for the character that cuts every line into the same number of fields, which is what actually distinguishes a separator from punctuation, and you can override it. Quoted fields are handled properly, so a comma or a newline inside quotes stays part of its value instead of breaking the row.
Sorting and searching do not move any data: they build an order and the page pages through that, so both stay quick on a large file. Sorting a column of numbers sorts it as numbers, so 2 comes before 10.
It edits as well as reads. Click any cell and type: the change is kept in this page and the file on your disk is not touched, because a page cannot write to it and this one would not want to. Column names can be renamed by clicking them.
Rows and columns are selected the way a spreadsheet selects them. Tick a row number to take that row, hold Shift and tick another to take everything between the two in the order they are on screen, and tick a heading to take the whole column. What you have selected is counted in a bar above the table, along with the one button that acts on it, so nothing goes without saying first how much is about to.
The tick beside the # takes every row the search has left, which turns a search into a way of removing everything that matches: find the rows with no email address, select them all, delete.
The search box looks in every column at once, which is the wrong tool as soon as the word you want appears in two of them. The funnel in a heading filters on that column alone, and offers the values already in it with a count beside each, so you can see that there are four spellings of "London" before deciding what to do about them. Several funnels narrow each other, and each one is a chip above the table that says what it is doing and removes itself when clicked.
Deleting a row does not renumber the others. If you were looking at row 4,231 before deleting row 12, it is still row 4,231 afterwards, which matters when the numbers are how you are keeping your place in something long.
When you are done, "Save a copy" writes a new file: every row or only the ones your search has left on screen, with or without the header, and with whichever separator you want, which is also the quickest way to turn a semicolon file into a comma one. Nothing is uploaded at any point, and if you change your mind, "Discard my changes" reads the original again.
How to use it
- Choose a CSV. Nothing is uploaded when you do.
- Read it, sort it, search it, and fix what needs fixing.
- Check the separator and whether the first row is column names.
- Sort by clicking a heading, and search to narrow the rows.
Questions
How big a file can it open?
Big enough that the limit is your machine rather than the tool. The file is held in the tab's memory once, and only the rows on screen are ever drawn, so scrolling stays smooth at sizes where a spreadsheet would have given up. Hundreds of megabytes are realistic on a desktop; a phone will run out of memory sooner.
Is my file uploaded anywhere?
No. The page reads it through your browser and parses it in WebAssembly on your own machine. Nothing in the page sends your file anywhere, so disconnect and it still works. That is the whole reason to use this for an export full of customer records.
What if it is not comma separated?
It is detected: the separator is whichever of comma, semicolon, tab or pipe cuts every line into the same number of fields, which beats counting occurrences because prose is full of commas. You can also set it yourself, including a colon or any single character.
Are quoted fields handled?
Yes. A comma inside quotes, a doubled quote meaning a literal quote, and a newline inside a quoted field are all read the way the format defines them rather than by splitting on the separator, which is where most quick CSV tools go wrong.
Why do some rows have a different number of fields?
Because the file does, and that is worth knowing rather than hiding. The count is shown, and short rows are padded so the columns still line up. It usually means an unescaped separator inside a value somewhere upstream.
Can I sort by a column?
Click its heading. Click it again to reverse, and a third time to put the file back in its original order, which nothing else will give you back. A column of numbers sorts numerically, and blank cells go last either way, since a blank is not a small value.
Does editing change my original file?
No, and it cannot. A web page has no way to write to a file you opened, so the changes live in this tab and your file on disk stays exactly as it was. Saving writes a new file with -edited on the end of its name, and until you do that, nothing has been written anywhere.
How do I delete rows or columns?
Select them first, then press Delete in the bar that appears. Tick a row number for one row, Shift and a second tick for a run of them, the tick in a heading for a whole column, and the tick beside the # for every row the search has left. A deleted row keeps its number reserved rather than shuffling everything below it up, so the numbering you were reading by does not move under you.
How is the funnel different from the search box?
The search box matches a row if the text appears anywhere in it, which is what you want when you do not know where to look. The funnel filters on one column, so searching for London in the city column does not also bring back the rows whose notes mention London. Both can be on at once, and each narrows what the other left.
Why does the funnel only offer some of the values?
It offers the most common ones, counted over the first twenty thousand rows that the other filters have left. On a column of a million unique order numbers a complete list would be neither useful nor quick, and the panel says when it has only looked at part of the file. Typing in the box filters on anything, listed or not.
Can I select more than one thing at a time?
Yes, and rows and columns at once: the bar reads '5 rows and 1 column selected' and deletes both together. Shift extends a run of rows in the order they appear on screen, which stops being the order of their numbers as soon as the table is sorted, and the run follows what you can see rather than what the numbers say.
Can I undo?
Discard my changes puts everything back, by reading the file again. There is no single-step undo, which is the honest trade for holding a file of a million rows in a tab: keeping every previous state would cost more memory than the file does.
Can I save only the rows I searched for?
Yes. Set 'Save which rows' to only the rows shown, and the copy contains what is on screen, in the order it is on screen. That makes searching a way to pull a subset out of a large file, and sorting a way to save it in a different order.
Can I convert between separators?
Yes. Open a file with semicolons or tabs, choose commas under 'Save with', and the copy is a comma file. The reading and the writing are separate choices, so this doubles as a converter without editing anything.
Your data stays on your device
Everything above runs inside your browser as WebAssembly compiled from Rust. Nothing you type is uploaded, logged or stored on a server. You can load this page once, go offline, and it still works.
This page makes no requests at all, to anywhere. That is not a promise in the copy: it is a Content-Security-Policy header your browser enforces, and connect-src on it is none. Open the network tab and watch nothing happen.