CSV Editor online

Code

Export

My documents

Click a document to open it. They are stored only in this browser - nothing is uploaded. Clearing the browser's site data removes them, so download the ones you want to keep.

AI Assistant

Any AI can work with you - ChatGPT, Claude, Gemini, Copilot.

  1. Click Copy prompt.
  2. Paste it into your AI and say what it should do with the table.
The AI should

The table travels in the link after the “#”, which no server sees. What you paste into your AI is handled by its provider.

Save to your server

The editor can send each saved version to your own server (a webhook), so your work is kept where you want it. Nothing is sent until you enter an address here.

What your server receives

A POST request with JSON (your server must allow CORS from https://csv.giit.ch):

{ "editor": "csv", "event": "save", "id": "…", "name": "Products",
  "content": "SKU,Product,Price\nA-100,Notebook,4.50\n",
  "updated": "2026-10-27T09:30:00.000Z" }
Embed the editor in your website
<iframe src="https://csv.giit.ch/?embed=1" style="width:100%;height:80vh;border:0"></iframe>
<script>
const frame = document.querySelector('iframe');
addEventListener('message', e => {
  if (e.origin !== 'https://csv.giit.ch' || e.source !== frame.contentWindow) return;
  if (e.data.type === 'csveditor:ready')
    frame.contentWindow.postMessage({ type: 'csveditor:load', name: 'Products',
      content: 'SKU,Product,Price\nA-100,Notebook,4.50\n' }, 'https://csv.giit.ch');
  if (e.data.type === 'csveditor:save') saveOnYourServer(e.data.content);
});
</script>

Also possible: ?src=<URL of a .csv file> opens a file, &webhook=<URL> saves this document there. The editor can also open in a window of its own (?embed=window), and your page can hand it its own AI prompt and a session key so the AI sends its result to your server (csveditor:ai, csveditor:key-request) - see "Use the editor on your own website" below the editor. Details are in llms.txt.

Help

How it works

  1. Open a CSV file, drop it into the window, or start with New. The raw text is on the left, the table in the middle.
  2. Edit cells in the table like in a spreadsheet: type, or press Enter or F2, or double-click a cell. Enter or Tab keeps the value, Escape cancels. The change goes into the CSV text right at that field - quotes only where needed, the line endings stay - and is one step for Undo.
  3. Copy and paste ranges between the table and Excel, LibreOffice or Google Sheets with Ctrl+C and Ctrl+V. Type into the row marked + to add a row.
  4. A click in the table puts the code's cursor on that field; the cursor in the code selects its cell.
  5. Sort with the arrows in the column heads and filter above the table: that only changes the view. Sort the data puts the rows of the file into that order.
  6. Format on the right sets how the text is read (separator, quote, header row) and converts it; Column shows what a column holds; Insert adds, deletes and moves rows and columns and cleans up.
  7. Problems (rows with another number of fields, unclosed quotes, empty or repeated header names) are listed above the code - click one to go there.
  8. Export makes an Excel workbook, JSON, Markdown, HTML, TSV or CSV with another separator. Download .csv saves the text as it is.

Keyboard shortcuts in the table

← → ↑ ↓, Shift + arrows
Move, select a range
Enter / F2 / typing
Edit the cell (typing replaces its value)
Alt + Enter
A line break inside the cell
Tab / Shift + Tab
Next / previous cell
Delete
Empty the selected cells
Ctrl + C / X / V
Copy / cut / paste (tab-separated, as spreadsheets use it)
Ctrl + A
Select the whole table
Ctrl + F
Filter the rows
Ctrl + Z / Y
Undo / redo
Ctrl + S / E
Save (download .csv, or to your server) / export
Ctrl + O
My documents
Ctrl + Enter in the code
Go to the cursor's cell in the table

Edit CSV files online, as a table and as text

The CSV Editor shows the raw CSV and the table side by side. Edit a cell in the table and the editor changes exactly that field in the text - the other quotes, the separator and the line endings stay as they were. A click in the table shows the field in the text, and the cursor in the text shows its cell. That makes it quick to fix exports from shops, banks and databases, clean up address lists, or prepare data for import.

Everything runs in your browser. Files are not uploaded, there is no sign-up and no advertising.

What the editor can do

Like a spreadsheet

Type into cells, move with the arrow keys and Tab, copy and paste ranges from and to Excel, LibreOffice or Google Sheets, add, delete and move rows and columns.

Any CSV

Comma, semicolon, tab or pipe as separator, detected by itself; with or without a header row; UTF-8 with or without BOM and Windows-1252; Windows and Unix line endings are kept.

Find what is broken

Rows with a different number of fields, quotes that are never closed, empty and repeated column names - listed with their line, one click away.

Sort, filter, look closer

Sort and filter the view without touching the file, or sort the data itself. The column panel shows the kind of values, empty and different ones, sum and average.

Big files

The table only draws the rows you see: files with 100 000 rows stay quick to scroll, filter and edit.

Export

Excel workbook (XLSX), JSON, Markdown and HTML tables, TSV, or CSV with another separator and encoding - with protection against spreadsheet formulas.

How it works

  1. Open - drop a CSV file into the window, open it with "Open file…", or start with a template under "New".
  2. Edit - change cells in the table or the text on the left; both follow each other. Use "Insert" for rows and columns, "Format" for the separator.
  3. Save - download the CSV as it is, or export it as XLSX, JSON, Markdown or HTML.

Use the editor on your own website

Any https page (and localhost) can embed the editor with an <iframe> and ?embed=1 - no sign-up, no key. Embedded, the editor hides this text and shows a Save button. There are two ways to get the table in and out.

1. Open a file from a link, save to your server

src= opens a file (your server must allow CORS), webhook= makes "Save" (Ctrl+S) send the document to that address. Add &token=… for an Authorization: Bearer … header and &auto to save after every change.

<iframe src="https://csv.giit.ch/?embed=1&src=https://your-site.com/data/products.csv&webhook=https://your-site.com/save.php"
        allow="clipboard-write" style="width:100%;height:800px;border:0"></iframe>

The webhook gets a POST with JSON { editor: "csv", event: "save", id, name, content, updated }. A small PHP script that stores it:

<?php
header('Access-Control-Allow-Origin: https://csv.giit.ch');
header('Access-Control-Allow-Headers: Content-Type, Authorization');
header('Access-Control-Allow-Methods: POST, OPTIONS');
if ($_SERVER['REQUEST_METHOD'] === 'OPTIONS') exit;
if (($_SERVER['HTTP_AUTHORIZATION'] ?? '') !== 'Bearer SECRET') { http_response_code(403); exit; }
$d = json_decode(file_get_contents('php://input'), true);
$name = preg_replace('/[^\w\- ]/u', '_', $d['name']);
file_put_contents(__DIR__ . "/data/$name.csv", $d['content']);
echo '{"ok":true}';

2. Your page holds the document (postMessage)

The editor says csveditor:ready, your page answers with csveditor:load, the editor reports csveditor:loaded, csveditor:change on real edits and csveditor:save when the user saves. Your page may send csveditor:get (the current state) or csveditor:save (press Save). Saving then goes through your own login and session.

<iframe id="ed" src="https://csv.giit.ch/?embed=1" allow="clipboard-write" style="width:100%;height:800px;border:0"></iframe>
<script>
const ed = document.getElementById('ed');
const ORIGIN = 'https://csv.giit.ch';

addEventListener('message', async e => {
  if (e.source !== ed.contentWindow || e.origin !== ORIGIN) return;
  const m = e.data;
  if (m.type === 'csveditor:ready') {               // the editor is ready: hand it the document
    ed.contentWindow.postMessage({
      type: 'csveditor:load',
      name: 'Products',
      content: await (await fetch('/data/products.csv')).text()
    }, ORIGIN);
  }
  if (m.type === 'csveditor:change') document.title = '● not saved';   // a real edit
  if (m.type === 'csveditor:save') {                // the user clicked "Save"
    await fetch('/api/save', { method: 'POST', headers: { 'Content-Type': 'application/json' },
      body: JSON.stringify({ name: m.name, content: m.content }) });
    document.title = 'Saved';
  }
});

// A save button on your own page: the answer comes as csveditor:save
function saveNow() { ed.contentWindow.postMessage({ type: 'csveditor:get' }, ORIGIN); }
</script>

AI Assistant inside your page: it works in the frame too. With allow="clipboard-write" on the iframe, "Copy prompt" uses the clipboard directly (otherwise the editor falls back to the old copy command, or shows the prompt to copy by hand). A link the AI sends cannot reach an editor inside another website, so the editor tells the AI and the user to paste the AI's whole answer into the editor instead - or open the editor in a window of its own.

3. In a window of its own

window.open("https://csv.giit.ch/?embed=window", "csveditor-17") opens the full editor in its own window and speaks the same messages with window.opener. Links from an AI reach it there. csveditor:load may also carry context: { host, title, rules } - the AI prompt then says where the document belongs and follows your rules - and hook: { url, token }, a webhook for this document only that is never stored. Closing the window with unsaved changes sends csveditor:closing.

4. AI through your own server

Hand the editor your own prompt, an address on your site and a key for this editor session. The AI dialog then shows "Connected to" your site, what you tell the AI, and the choice change the current document or make a new one; Copy prompt puts it all together. The AI posts its result with the key to your server, and your page opens it in the editor - a new document opens separately and stays in the user's browser. One key per editor session: it stays valid while the editor is open, and only while it has none the editor asks for it with csveditor:key-request. The editor never sends the key itself and never stores it; the address must be https on your own host or a subdomain of it.

const key = async () => (await fetch('/api/ai-key.php?doc=17')).json();   // one key per editor session
const k = await key();
ed.contentWindow.postMessage({ type: 'csveditor:load', name: 'Products', content, ai: {
  label: 'My Site', prompt: 'Keep the column names. Prices in CHF.',
  endpoint: 'https://your-site.com/api/ai-result.php', key: k.key } }, ORIGIN);
// remember the id from csveditor:loaded and ignore change/save/closing with another id
// only while the editor has no key:
if (m.type === 'csveditor:key-request') { const k = await key(); ed.contentWindow.postMessage({ type: 'csveditor:ai', key: k.key }, ORIGIN); }
// while the editor is open, tell your server every minute; closing the editor or the page voids the key
setInterval(() => fetch('/api/ai-key.php?alive=' + k.key.slice(0, 8)), 60000);
// your server has a result (polling, SSE …): target is "current" or "new"
ed.contentWindow.postMessage({ type: 'csveditor:load', name: 'Products', content: draft, from: 'ai', target }, ORIGIN);

Make keys with at least 128 random bits, store only their hash, bind each to the logged-in user, the document and this editor session, make one per session, keep it valid only while your page reports the session as open, and void it when the editor or the page closes.

The whole protocol is in llms.txt - give it to an AI and it builds the connection for your system. The other giit editors work the same way with their own prefix, for example the LaTeX Editor with latexeditor: - latex.giit.ch.

Frequently asked questions

Is my CSV file uploaded?

No. The editor runs entirely in your browser. Your files are never sent to a server, unless you set up a webhook to your own server yourself.

Does the editor change my file when I edit one cell?

Only that cell. The editor writes the change into the CSV text exactly where the field is and leaves the rest as it was: the other quotes, the separator and the line endings stay. A field is put in quotes only when it needs them.

My CSV uses semicolons - does that work?

Yes. The editor detects comma, semicolon, tab and pipe as separator; you can also choose it under Format. Convert turns the file into another separator.

How do I open the CSV in Excel without broken umlauts?

Export it as XLSX, or download the CSV with a byte order mark (BOM) - tick it under Format or choose "UTF-8 with BOM" in the export. Excel then reads UTF-8 correctly.

Can it handle large files?

Yes. The table only draws the rows you see, so files with 100 000 rows stay quick to scroll, filter and edit.

Where are my documents saved?

Only in your browser. Click the folder button at the top left (My documents) to open, rename, duplicate, download or delete them. Clearing your browser's site data removes them, so download the ones you want to keep - or let the editor send them to your own server ("Save to server"). Very large files may not fit into the browser's storage; the editor tells you when that happens.

Can an AI write in the CSV Editor?

Yes, any AI - ChatGPT, Claude, Gemini, Copilot or the AI in your coding tool. Click "AI Assistant", then "Copy prompt", paste it into your AI and say what it should do. The AI answers with a link; click it and the table appears in your editor. "Undo" takes every change back.

Does the CSV Editor cost anything?

No. The editor is free, without ads and without sign-up.