CSV Editor — Manual
Every CSV Editor feature: import, toolbar, settings, delimiter and encoding detection, export as CSV, JSON, and Markdown, and the limits.
Back to the overview: CSV Editor · Open the tool live: www.jpkc.com/tools/csv/
This manual describes the CSV Editor in full: every toolbar button, every setting, how delimiter detection, encoding detection, and the parser work, which export formats exist, and what limits apply. The tool's interface is in English, so the button and field names here are the real labels.
How the interface is laid out
The page consists of two cards: the editor with toolbar, table, and status bar, and a collapsible Settings card below it. On load, the tool restores the most recently auto-saved table from browser storage — including column names, file name, and delimiter; header mode follows whatever was saved. If there is nothing saved, it starts with an empty table at the configured size.
Eight buttons carry a text label — New, Open, Copy, Paste, CSV, JSON, Markdown, and Reset. On narrow screens the toolbar hides these labels and shows icons only; they appear from tablet width upward. Transpose, Undo, Redo, and Fullscreen, on the other hand, are icon-only buttons at every width; the names used in this manual follow their tooltips ("Transpose rows and columns", "Undo (Ctrl+Z)", "Redo (Ctrl+Y)", "Toggle fullscreen mode"). Every button carries a tooltip and a label for screen readers.
Importing data
There are three equivalent ways to load a table. All three use the same delimiter detection and the same parser, and all three respect the header setting. All three also replace the current table without asking — unlike New — and the automatic save overwrites the previous state right away. If you have been working on the open table, export it first. Anything unusual found while reading — a quote that is never closed, padded rows, an encoding fallback — is reported in a yellow notice box directly above the table (see Notices on import).
Open (open a file)
Brings up the file dialog. Files with the extensions .csv, .tsv, and .txt are accepted, up to 50 MB; the tool refuses larger files with a message. The file is read locally as raw bytes and turned into text with the configured encoding (see Encoding detection) — there is no upload. After opening, a toast reports the file name, row count, detected delimiter, and encoding, for example Opened "customers.csv" (120 rows, semicolon-separated, WINDOWS-1252).
Drag-and-drop
You can pull a file straight onto the editor card. On drop the file is read just as with Open.
Paste (from the clipboard)
Reads the clipboard's text contents and builds a new table from it. This lets you drop in a selection from Excel, Google Sheets, or Numbers directly (these copy tab-separated, which auto-detection recognizes as a tab). The toast then reports row count and delimiter, for example Pasted 12 rows (tab-separated). Clipboard access requires the matching browser permission; if the browser denies it, a notice appears, and an empty clipboard is reported as well. Paste leaves the export file name unchanged: if you had opened customers.csv before, exports of the pasted data are still named customers.*.
The toolbar in detail
The buttons come in this order: New, Open, Copy, Paste, Transpose, Undo, Redo, Fullscreen, CSV, JSON, Markdown, Reset — with the search field to the right. Transpose, Undo, Redo, and Fullscreen show only an icon (a left/right double arrow, an arrow counterclockwise and clockwise, four arrows pointing outward).
New
Creates an empty table at the size set under Settings (New sheet: rows × columns). If you have edited the current table, the tool asks first ("Start a new spreadsheet? The current one is replaced."); an unchanged table is replaced without asking. The export file name falls back to data.
Open
Brings up the file dialog — see Open (open a file) above.
Copy
Copies the entire table tab-separated to the clipboard — in header mode including a header row with the column names. The separator here is always the tab, not the one chosen in Settings, so the data pastes straight into a spreadsheet. Cells containing a tab, a quote, a line break, or leading or trailing whitespace are wrapped in "…" so the target application reads them as a single cell.
Paste
See Paste (from the clipboard) above.
Transpose
Swaps rows and columns: a table with m rows and n columns becomes one with n rows and m columns. Handy when an export is laid out sideways. In header mode the column names are not lost: they are rotated along and end up in the first column, while the former first column becomes the new header row. A toast reports the old and the new size. Clicking Transpose a second time flips the table back.
Undo and Redo
Undo the last change or redo it. Also work from the keyboard with Ctrl+Z (undo) and Ctrl+Y (redo). The history covers edits within the table; Transpose, toggling First row is header, and every import rebuild the table and therefore start a fresh history.
Fullscreen
Toggles a fullscreen mode that hides the header, footer, and the Settings card and lets the editor fill the whole window. The same button or the Esc key exits it.
CSV, JSON, and Markdown (export)
Download the table as a file — details under Export.
Reset
Resets the editor: after a confirmation prompt ("Reset spreadsheet and clear saved data?"), the saved copy in browser storage is deleted and an empty table is created. The notice box, cell info, and selection statistics are cleared; the export file name falls back to data, and the delimiter used by Same as opened file falls back to the comma. Your settings are kept.
Search
The search field on the right of the toolbar filters the table live down to the rows that contain the search term (with a 300 ms delay as you type). It matches substrings and ignores case. The × next to it or the Esc key clears the search.
Editing the table
The table is built on Jspreadsheet CE and behaves largely like a spreadsheet application:
- Editing cells: double-click a cell to edit it; select several cells by dragging with the mouse.
- Context menu (right-click): what it offers depends on where you click. Right-clicking the column header shows the column actions: insert columns (Insert a new column before / after) or delete them (Delete selected columns), rename the column (Rename this column), and sort by it (Order ascending / Order descending). Right-clicking a cell or a row number shows the row actions (Insert a new row before / after, Delete selected rows); in a cell you also get comments (Add comments), which the tool neither saves automatically nor exports. Each of these menus also holds Copy… and Paste… (Ctrl+C / Ctrl+V) as well as Save as… (Ctrl+S) and About — Save as… is the library's raw export and bypasses the export settings (see Export).
- Sorting by double-click: double-clicking a column header sorts by that column; another double-click reverses the direction.
- Moving and resizing: drag rows (by the row number) and columns (by the column header) to reorder them, and drag column widths and row heights.
Sorting is type-aware: empty cells always go last (descending, too), numbers are compared numerically (9 before 10, 1,50 read as 1.5), and text is compared "naturally" and case-insensitively (item 2 before item 10). In ascending order, numbers come before text. Which values count as numbers is described under Status bar.
Every cell is text. The editor does not calculate formulas such as =SUM(A1:A3); they stay in the cell as a string. Likewise, HTML in a cell is displayed as text, not executed. Above 300 rows the table renders only the visible part and loads more as you scroll — that keeps even files with tens of thousands of rows usable.
The settings
Expand the Settings card via its header. All values are saved in the browser automatically when changed.
Import delimiter
Determines what separates fields on import (Open, drag-and-drop, Paste). Options:
- Auto-detect (default) — automatic detection (see Delimiter detection).
- Comma (
,) - Semicolon (
;) — typical for CSV exports from Excel in German and many other European locales. - Tab
- Pipe (
|)
If you change the setting after opening a file, the tool immediately reads that file again with the new value — provided you haven't edited it yet. Otherwise the table is left alone, and a toast tells you the setting applies to the next file you open.
Import encoding
Determines how the bytes of an opened file are turned into text. Options:
- Auto (UTF-8, else Windows-1252) (default) — see Encoding detection.
- UTF-8
- Windows-1252 (Excel, Western) — the encoding in which Excel on Western European Windows systems saves classic "CSV".
- ISO-8859-15 (Latin-9, which includes the euro sign)
- UTF-16 LE
As with the delimiter, a change immediately re-reads the most recently opened file if it hasn't been edited. The setting has no effect on Paste — the clipboard already delivers text.
Export delimiter
Determines the delimiter of the CSV export, independently of the import:
- Same as opened file (default) — exports with the delimiter the file was read with, so a semicolon file comes back out as a semicolon file. For pasted data (Paste) the delimiter detected there applies; before the first import, the comma.
- Comma (
,), Semicolon (;), Tab, Pipe (|) — a fixed choice.
With Tab the file gets the extension .tsv instead of .csv.
New sheet: rows × columns
The size of a newly created empty table (New, Reset, first start). The defaults are 10 rows × 8 columns. The input fields are set up for 1–500 rows and 1–50 columns (that's how far the arrow keys go); the tool still accepts a larger value you type in, and an empty field or 0 falls back to the default. These values only affect the empty starting size, not imports — a loaded file keeps its actual size.
First row is header
When the checkbox is on, the first row is treated as column headers: on import it becomes the column titles instead of a data row, and on export it affects every format (see Export). The switch applies immediately to the open table: turning it on makes the first data row the column names, turning it off moves the column names back into the data as the first row — no need to reload the file.
To make the names usable as keys, the tool cleans them up: empty headers become Column 1, Column 2, and so on (by position), and duplicates get a suffix (Name, Name_2, Name_3). Column names containing a comma are kept intact.
CSV export with UTF-8 BOM
Puts a byte order mark (BOM) at the start of the CSV export. Excel uses it to recognize the file as UTF-8 and displays accented characters correctly; without a BOM, Excel usually reads a double-clicked CSV file in the system encoding. Off by default. The option has no effect on JSON or Markdown export.
Protect against formula injection
Protection against so-called CSV or formula injection: values that start with =, +, -, or @ (and also a leading tab or carriage return) get an apostrophe ' prepended on CSV export. A spreadsheet application then treats the cell as text instead of running it as a formula. Plain numbers such as -2 or +3.5 stay unchanged. Off by default; worth enabling when the data comes from untrusted sources (forms, shop orders) and will be processed further in Excel or LibreOffice.
Delimiter detection (Auto-detect)
With Import delimiter set to Auto-detect, the editor tries all four candidates — comma, semicolon, tab, and pipe. For each, it parses the first 30 lines (taken from the first 65,536 characters of the file) with the real parser, so delimiters inside quotes don't count. The winner is the character that splits the lines most consistently into at least two columns; at equal consistency, the higher column count decides. If no candidate yields at least two columns, detection falls back to the comma.
Because several lines count, a lone title line above the actual table or a comma inside a name no longer throws detection off. If it still gets it wrong, set the delimiter explicitly — the file is then read again automatically.
Encoding detection
With Import encoding set to Auto, the tool works in three stages:
- Byte order mark: if the file starts with a BOM, the encoding it indicates wins — UTF-8, UTF-16 LE, or UTF-16 BE.
- Strict UTF-8: without a BOM, the tool tries to read the file as UTF-8. If that succeeds without errors, it's UTF-8.
- Windows-1252: if the file contains byte sequences that are invalid in UTF-8, the tool reads it as Windows-1252 and shows a notice: the file is not valid UTF-8 and was read as Windows-1252; if characters look wrong, choose the encoding in Settings.
With Auto, a BOM is stripped and never ends up in the first cell — the same goes for a matching encoding chosen by hand (UTF-8 or UTF-16 LE). If you set a UTF-8 file with a BOM to Windows-1252 or ISO-8859-15, however, the BOM bytes show up as  at the start of the first cell. The toast after opening names the detected encoding.
The parser (RFC 4180)
Reading is handled by a dedicated parser (no external library) that follows RFC 4180 and treats the usual real-world deviations the way spreadsheet applications do:
- Quotes: fields in
"…"may contain the delimiter, line breaks, and quotes. - Doubled quotes:
""inside a quoted field becomes a single". - Quotes in the middle of a field: a
"only opens a quoted field at the start of a field. A value like5" Displaystays exactly as it is and doesn't drag the rest of the file along with it. - Text after the closing quote (as in
"abc"def) is kept as part of the field. - Different line endings:
\r\n,\n, and\rare all recognized as line breaks. - Rows of unequal length: shorter rows are padded with empty cells to the width of the longest row.
- Trailing empty rows are trimmed off the end.
Notices on import
Whatever the parser repairs or cannot read unambiguously is reported in the yellow notice box above the table:
- A quote that is never closed — with the line number where it was opened. The rest of the file then sits in a single field; usually the source file is broken at that point.
- Text after a closing quote — with the line number (first occurrence only).
- Padded rows — how many rows had fewer columns than the widest one.
- Encoding fallback to Windows-1252 (see above).
The box disappears on the next import that turns up nothing, and on New and Reset.
Export
All three file exports name the file after the opened file (customers.csv → customers.csv, customers.json, customers.md); after New or Reset, and without an opened file, it's called data; after Paste it keeps the name of the file opened last. Empty rows at the end of the table are trimmed before export, and so are empty columns at the end. In header mode, the column names — including columns renamed in the table — form the header row; a trailing empty column stays in the export as soon as its name is anything other than Column 1, Column 2, and so on. That includes letter names: if you create a new table with New or Reset while header mode is on, the columns are named A, B, C …, and every column ends up in the export under those names. Columns you insert via the context menu in header mode get a letter as their name, too.
Save as… in the table's context menu and Ctrl+S are not part of these exports: they come from the spreadsheet library and download a raw export — tab-separated, always with a BOM, as Sheet1.csv. Export delimiter, the opened file's name, and Protect against formula injection don't apply there. For clean exports, use the CSV, JSON, and Markdown buttons.
Export CSV
Downloads the table as a .csv file (as .tsv when the export delimiter is Tab). The delimiter comes from Export delimiter (default: same as the opened file). The output follows RFC 4180: fields containing the delimiter, a quote, a line break, or leading or trailing whitespace are wrapped in "…", contained quotes are doubled, and rows are separated with \r\n. If First row is header is on, the column headers are prepended as the first row. The encoding is always UTF-8, optionally with a BOM (CSV export with UTF-8 BOM); Protect against formula injection defuses formula-like values.
Export JSON
Downloads the table as a .json file (indented with two spaces). The structure depends on header mode:
- Header mode off — an array of arrays: each row is an array of its cell values.
[
[
"Alice",
"30",
"Berlin"
],
[
"Bob",
"25",
"Hamburg"
]
]- Header mode on — an array of objects: each row becomes an object whose keys are the column headers. The keys are guaranteed to be unique and non-empty (empty names become
Column 1…, duplicates get_2,_3), so no value overwrites another.
[
{
"name": "Alice",
"age": "30",
"city": "Berlin"
},
{
"name": "Bob",
"age": "25",
"city": "Hamburg"
}
]All values are strings — the editor does not turn numbers into numeric JSON types on export.
Export Markdown
Downloads the table as an .md file containing a Markdown table (GitHub Flavored Markdown) — ready to paste into a README, a wiki, or documentation:
- The first row is always the table header: in header mode the column names, otherwise the first data row (the toast points this out).
- Number columns are right-aligned (
---:) when every non-empty value below the header is a number; all other columns stay left-aligned. - Special characters are escaped:
|becomes\|,\becomes\\, so no value can break the table apart. Line breaks inside cells become<br>, and whitespace at the cell edges is dropped.
| Product | Price | Stock |
| --- | ---: | ---: |
| Monitor 27" | 249.00 | 12 |
| Cable A\|B | 9.90 | 140 |Without header mode, the tool doesn't export an empty table; it reports "No data to export." instead. In header mode the header row counts as content, so you get a Markdown table that consists of the column names only.
Copy (clipboard)
The Copy button is the fourth output: the entire table tab-separated on the clipboard. See Copy.
Status bar
Below the table, a bar shows four pieces of information:
- the size of the table (
N rows × M columns, in header mode with the suffix+ header), - the active cell in spreadsheet notation (e.g.
B3) plus a preview of its contents (truncated to 50 characters), - for a multi-cell selection, the selected range (e.g.
A1:C5) and selection statistics: if numbers are included, it shows SUM, AVG, MIN, and MAX plus how many of the selected cells are numeric (… | 4 of 6 cells numeric); without numbers, just COUNT with the number of cells, - the storage status:
Saved in this browser · 14:32with the time of the last save — or a warning if the table is too large for browser storage (see Automatic saving).
For the statistics, a cell only counts as a number if its entire content is a number. Both German and English notations are recognized: 1,50, 1.234,5, 1,234.5, -2, 1e3. A date such as 2024-07-07 or a value like 12abc does not count as a number. Sorting uses the same recognition.
Automatic saving
The tool saves the table automatically to the browser's LocalStorage: right after opening, pasting, or creating a table, and 1.5 seconds after every change to cells or structure (inserting, deleting, moving, sorting, renaming, undo/redo). Data, column names, file name, and delimiter are saved, all strictly locally. That way your work survives a reload or closing the tab. There are no separate buttons for saving and restoring — the next time you visit, the most recently saved table is simply back.
The saved copy is limited to about 2 million characters (browser storage holds only a few megabytes per website). If the table is larger or storage is full, the status bar shows a warning with the size (Too large to keep in this browser (… MB) — export to keep your changes), and any older saved copy is deleted so that an outdated state doesn't turn up on your next visit. Export large tables to a file for that reason.
The settings are stored in a separate entry and survive Reset.
Architecture and privacy
The CSV Editor is a purely client-side application with no server component: files are read and decoded locally in the browser, edited there, and emitted again through a generated download. There is no upload, no account, and no data transfer. The table engine is Jspreadsheet CE (with jSuites); decoding, delimiter detection, the parser, export, and number recognition live in a dedicated module of the tool. Because CSV files often contain sensitive data, that's a deliberate advantage: the data does not leave your machine.
Limits
- 50 MB per file at most. The editor won't open larger files.
- Storage limit for the auto-save. Above about 2 million characters the tool stops saving to the browser (with a warning); editing itself continues, but your changes only survive via export.
- Four delimiters. Only comma, semicolon, tab, and pipe are detected and selectable; exotic delimiters are not supported.
- Four fixed encodings. Besides Auto, you can choose UTF-8, Windows-1252, ISO-8859-15, and UTF-16 LE; UTF-16 BE is only detected automatically via its BOM. Export is always UTF-8.
- No formulas. Every cell is text; formulas are neither calculated nor evaluated on import.
- Values are strings. On JSON export, numbers are not converted to JSON number types but emitted as strings.
- Copy is always tab-separated — regardless of the chosen delimiter.
- Undo stops at rebuilds. Transpose, the header switch, and every import start a fresh undo history.
- Clipboard needs a permission. Paste only works if the browser allows read access to the clipboard.
For the starting point and the big picture, see the overview page; for concrete workflows the examples; and for clever tricks the tips & tricks. You can try all of it directly in the tool.