# CSV Editor — Manual

> Complete feature reference for the CSV Editor: import, every toolbar button, the settings, delimiter detection, CSV/JSON export, persistence, and the limits.

Source: https://www.jpkc.com/db/en/tools/csv/manual/

Back to the overview: [CSV Editor](https://www.jpkc.com/db/en/tools/csv/) · Open the tool live: [www.jpkc.com/tools/csv/](https://www.jpkc.com/tools/csv/)

This manual describes the **CSV Editor** in full: every toolbar button, every setting, how delimiter 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 first load the tool tries to restore a previously auto-saved table from browser storage; if there is none, it starts with an empty table at the configured default size.

## 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.

### Open (open a file)

Brings up the file dialog. Files with the extensions `.csv`, `.tsv`, and `.txt` are accepted. The file is read locally as text via `FileReader` — there is no upload. After opening, a brief toast reports the file name, row count, and the detected delimiter.

### Drag-and-drop

You can pull a file straight onto the editor card. The border highlights as you hover; 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). Clipboard access requires the matching browser permission; if the browser denies it, a notice appears.

## The toolbar in detail

### New

Creates an empty table at the default size set in **Settings** (Default Rows × Default Columns). Any data already loaded is replaced.

### Store and Restore

**Store** explicitly saves the current table (including column headers) to the browser's LocalStorage. **Restore** loads that saved table again; the button is disabled while nothing is stored. Independently of this, the tool saves automatically (see [Automatic saving](#automatic-saving)).

### Copy

Copies the **entire** table **tab-separated** to the clipboard. The separator here is always the tab — not the one chosen in Settings — so the data pastes straight into a spreadsheet.

### Paste

See [Paste (from the clipboard)](#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.

### Undo and Redo

Undo the last change or redo it. Also work from the keyboard with **Ctrl+Z** (undo) and **Ctrl+Y** (redo).

### 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 and JSON (export)

Download the table as a file — details under [Export](#export).

### Reset

Resets the editor: after a confirmation prompt, the saved data is cleared and an empty table is created.

### Search

The search field on the right of the toolbar filters the table live (with a short delay as you type). The **×** next to it or the **Esc** key clears the search.

## The settings

Expand the Settings card via its header. All values are saved automatically in the browser when changed.

### CSV Delimiter

Determines what separates fields — both on import and on CSV export. Options:

- **Auto-detect** (default) — automatic detection on import (see below). For export, "auto" falls back to the comma.
- **Comma (`,`)**
- **Semicolon (`;`)** — typical for CSV exports from German-language Excel.
- **Tab**
- **Pipe (`|`)**

### Default Rows and Default Columns

The size of a newly created empty table (**New**). Default Rows is 10 (1–500), Default Columns is 8 (1–50). These values only affect the empty starting size, not the import — 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 both formats (see below). On import this requires the file to have more than one row.

## Delimiter detection (Auto-detect)

With the delimiter set to **Auto-detect**, the editor inspects the **first line** of the file and counts the occurrences of the four candidates comma, semicolon, tab, and pipe — characters inside quotes are skipped correctly. The most frequent character wins; if none occurs, detection falls back to the **comma**. Because only the first line is examined, detection is fast but depends on a typical header line — for an unusual file layout, it's better to set the delimiter manually.

## The parser (RFC 4180)

Reading is handled by a dedicated, **RFC 4180-compliant** parser (no external library). It handles:

- **Quotes**: fields in `"…"` may contain the delimiter, line breaks, and quotes.
- **Doubled quotes**: `""` inside a field becomes a single `"`.
- **Different line endings**: `\r\n`, `\n`, and `\r` are all recognized as line breaks.
- **Trailing empty rows** are trimmed off the end.

## Export

### Export CSV

Downloads the table as a file named **`data.csv`**. The delimiter is the one chosen in Settings (the comma for "auto"). The output is RFC 4180-compliant: fields containing the delimiter, a quote, or a line break 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.

### Export JSON

Downloads the table as a file named **`data.json`** (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.

```json
[
  ["Alice", "30", "Berlin"],
  ["Bob", "25", "Hamburg"]
]
```

- **Header mode on** (and headers present) — an **array of objects**: each row becomes an object whose keys are the column headers.

```json
[
  { "name": "Alice", "age": "30", "city": "Berlin" },
  { "name": "Bob", "age": "25", "city": "Hamburg" }
]
```

All values are strings — the editor does not interpret numbers as numeric JSON types on export.

### Copy (clipboard)

The **Copy** button is the third output: the entire table tab-separated on the clipboard. See [Copy](#copy).

## Status bar

Below the table, a bar shows four pieces of information:

- the **size** of the table (rows × columns),
- the **active cell** in spreadsheet notation (e.g. `B3`) plus a — truncated — preview of its contents,
- for a **multi-cell selection**, the selected range (e.g. `A1:C5`) and, if numbers are selected, automatic **SUM**, **AVG**, and **COUNT**,
- the **storage status** (timestamp and row count of the most recently saved table).

## Automatic saving

Every change to cells or to the structure triggers, after a short delay (about two seconds), an automatic save to the browser's LocalStorage. That way your work survives an accidental reload. The table and column headers are saved, all of it strictly local. If saving fails (for instance because browser storage is full), a notice appears.

## Architecture and privacy

The CSV Editor is a **purely client-side application** with no server component: files are read locally via `FileReader`, edited in the browser, 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). Because CSV files often contain sensitive data, that's a deliberate advantage: the data does not leave your machine.

## Limits

- **Auto-detection looks only at the first line.** If the header line is atypical, the wrong delimiter may be chosen — then set it manually in Settings.
- **Four delimiters.** Only comma, semicolon, tab, and pipe are detected and selectable; exotic delimiters are not supported.
- **Fixed export file names.** Downloads are always called `data.csv` or `data.json`; you assign your own name when saving.
- **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.
- **Header import needs more than one row** for the first row to become headers.
- **LocalStorage limits.** Very large tables can exceed browser storage; the automatic save then fails (with a notice), while editing itself continues.
- **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](https://www.jpkc.com/db/en/tools/csv/); for concrete workflows the [examples](https://www.jpkc.com/db/en/tools/csv/examples/); and for clever tricks the [tips & tricks](https://www.jpkc.com/db/en/tools/csv/tips/). You can try all of it directly in the [tool](https://www.jpkc.com/tools/csv/).

