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-01-15T09: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

Edytuj pliki CSV online jako tabelę i jako tekst

Edytor CSV pokazuje surowy CSV i tabelę obok siebie. Zmień komórkę w tabeli, a edytor zmieni dokładnie to pole w tekście - pozostałe cudzysłowy, separator i końce wierszy zostają takie, jakie były. Kliknięcie w tabeli pokazuje pole w tekście, a kursor w tekście pokazuje swoją komórkę. Dzięki temu szybko poprawisz eksporty ze sklepów, banków i baz danych, uporządkujesz listy adresowe albo przygotujesz dane do importu.

Wszystko działa w przeglądarce. Pliki nie są nigdzie wysyłane, nie ma rejestracji ani reklam.

Co potrafi edytor

Jak arkusz kalkulacyjny

Pisz w komórkach, poruszaj się strzałkami i klawiszem Tab, kopiuj i wklejaj zakresy z i do Excela, LibreOffice lub Arkuszy Google, dodawaj, usuwaj i przesuwaj wiersze i kolumny.

Dowolny CSV

Przecinek, średnik, tabulator lub kreska pionowa jako separator, wykrywany samoczynnie; z wierszem nagłówka lub bez; UTF-8 z BOM lub bez i Windows-1252; końce wierszy Windows i Unix są zachowywane.

Znajdź, co jest zepsute

Wiersze z inną liczbą pól, niezamknięte cudzysłowy, puste i powtórzone nazwy kolumn - wymienione z numerem wiersza, jedno kliknięcie dalej.

Sortowanie, filtrowanie, analiza

Sortuj i filtruj widok bez zmieniania pliku albo sortuj same dane. Panel kolumny pokazuje rodzaj wartości, puste i różne wartości, sumę i średnią.

Duże pliki

Tabela rysuje tylko widoczne wiersze: pliki ze 100 000 wierszy pozostają szybkie przy przewijaniu, filtrowaniu i edycji.

Eksport

Skoroszyt Excel (XLSX), tabele JSON, Markdown i HTML, TSV albo CSV z innym separatorem i kodowaniem - z ochroną przed formułami arkuszy kalkulacyjnych.

Jak to działa

  1. Otwieranie - upuść plik CSV w oknie, otwórz go przez „Otwórz plik…” albo zacznij od szablonu w menu „Nowy”.
  2. Edycja - zmieniaj komórki w tabeli lub tekst po lewej; jedno podąża za drugim. Wiersze i kolumny znajdziesz w „Wstaw”, separator w „Format”.
  3. Zapis - pobierz CSV bez zmian albo wyeksportuj go jako XLSX, JSON, Markdown lub HTML.

Edytor na własnej stronie

Każda strona https (i localhost) może osadzić edytor za pomocą <iframe> i ?embed=1 - bez rejestracji, bez klucza. Po osadzeniu edytor ukrywa ten tekst i pokazuje przycisk Zapisz. Tabelę można przekazywać do edytora i z niego na dwa sposoby.

1. Otwieranie pliku z linku, zapis na twoim serwerze

src= otwiera plik (twój serwer musi zezwalać na CORS), webhook= sprawia, że „Zapisz” (Ctrl+S) wysyła dokument pod ten adres. Dodaj &token=…, aby wysyłać nagłówek Authorization: Bearer …, i &auto, aby zapisywać po każdej zmianie.

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

Webhook otrzymuje żądanie POST z JSON { editor: "csv", event: "save", id, name, content, updated }. Mały skrypt PHP, który go zapisuje:

<?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. Dokument przechowuje twoja strona (postMessage)

Edytor zgłasza csveditor:ready, twoja strona odpowiada csveditor:load, edytor zgłasza csveditor:loaded, csveditor:change przy rzeczywistych zmianach i csveditor:save, gdy użytkownik zapisuje. Twoja strona może wysłać csveditor:get (bieżący stan) lub csveditor:save (naciśnięcie Zapisz). Zapis odbywa się wtedy przez twoje własne logowanie i sesję.

<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') {               // edytor jest gotowy: przekaż mu dokument
    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';   // rzeczywista zmiana
  if (m.type === 'csveditor:save') {                // użytkownik kliknął „Zapisz”
    await fetch('/api/save', { method: 'POST', headers: { 'Content-Type': 'application/json' },
      body: JSON.stringify({ name: m.name, content: m.content }) });
    document.title = 'Saved';
  }
});

// Przycisk zapisu na twojej stronie: odpowiedź przychodzi jako csveditor:save
function saveNow() { ed.contentWindow.postMessage({ type: 'csveditor:get' }, ORIGIN); }
</script>

Asystent AI na twojej stronie: działa także w ramce. Z allow="clipboard-write" w iframe „Kopiuj prompt” korzysta bezpośrednio ze schowka (w przeciwnym razie edytor używa starego polecenia kopiowania albo pokazuje prompt do ręcznego skopiowania). Link wysłany przez AI nie dotrze do edytora osadzonego w innej stronie, więc edytor prosi AI i użytkownika o wklejenie całej odpowiedzi AI do edytora - albo o otwarcie edytora we własnym oknie.

3. We własnym oknie

window.open("https://csv.giit.ch/?embed=window", "csveditor-17") otwiera pełny edytor we własnym oknie, który wymienia te same wiadomości z window.opener. Linki od AI docierają do niego tam. csveditor:load może też zawierać context: { host, title, rules } - prompt dla AI mówi wtedy, gdzie należy dokument, i stosuje twoje zasady - oraz hook: { url, token }, webhook tylko dla tego dokumentu, który nigdy nie jest zapisywany. Zamknięcie okna z niezapisanymi zmianami wysyła csveditor:closing.

4. AI przez twój własny serwer

Przekaż edytorowi własny prompt, adres w twojej witrynie i klucz dla tej sesji edytora. Okno AI pokazuje wtedy „Połączono z” twoją witryną, to, co przekazujesz AI, oraz wybór: zmienić bieżący dokument lub utworzyć nowy; Kopiuj prompt łączy to wszystko. AI wysyła swój wynik z kluczem na twój serwer, a twoja strona otwiera go w edytorze - nowy dokument otwiera się osobno i zostaje w przeglądarce użytkownika. Jeden klucz na sesję edytora: pozostaje ważny, dopóki edytor jest otwarty, a edytor prosi o niego przez csveditor:key-request tylko wtedy, gdy go nie ma. Edytor nigdy sam nie wysyła klucza i nigdy go nie zapisuje; adres musi być adresem https na twoim własnym hoście lub jego subdomenie.

const key = async () => (await fetch('/api/ai-key.php?doc=17')).json();   // jeden klucz na sesję edytora
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);
// zapamiętaj id z csveditor:loaded i ignoruj change/save/closing z innym id
// tylko gdy edytor nie ma klucza:
if (m.type === 'csveditor:key-request') { const k = await key(); ed.contentWindow.postMessage({ type: 'csveditor:ai', key: k.key }, ORIGIN); }
// dopóki edytor jest otwarty, informuj serwer co minutę; zamknięcie edytora lub strony unieważnia klucz
setInterval(() => fetch('/api/ai-key.php?alive=' + k.key.slice(0, 8)), 60000);
// twój serwer ma wynik (polling, SSE …): target to "current" lub "new"
ed.contentWindow.postMessage({ type: 'csveditor:load', name: 'Products', content: draft, from: 'ai', target }, ORIGIN);

Twórz klucze z co najmniej 128 losowymi bitami, przechowuj tylko ich hash, wiąż każdy z zalogowanym użytkownikiem, dokumentem i tą sesją edytora, twórz jeden na sesję, utrzymuj go ważnym tylko wtedy, gdy twoja strona zgłasza sesję jako otwartą, i unieważniaj go, gdy edytor lub strona zostaną zamknięte.

Cały protokół jest opisany w llms.txt - przekaż go AI, a zbuduje połączenie dla twojego systemu. Pozostałe edytory giit działają tak samo z własnym prefiksem, na przykład Edytor LaTeX z latexeditor: - latex.giit.ch.

Najczęstsze pytania

Czy mój plik CSV jest gdzieś wysyłany?

Nie. Edytor działa w całości w przeglądarce. Pliki nigdy nie są wysyłane na serwer, chyba że sam skonfigurujesz webhook do własnego serwera.

Czy edytor zmienia mój plik, gdy edytuję jedną komórkę?

Tylko tę komórkę. Edytor zapisuje zmianę w tekście CSV dokładnie tam, gdzie jest pole, a resztę zostawia bez zmian: pozostałe cudzysłowy, separator i końce wierszy zostają. Pole jest ujmowane w cudzysłów tylko wtedy, gdy to potrzebne.

Mój CSV używa średników - czy to działa?

Tak. Edytor wykrywa przecinek, średnik, tabulator i kreskę pionową jako separator; można go też wybrać w karcie Format. Konwersja zmienia separator pliku na inny.

Jak otworzyć CSV w Excelu bez zepsutych polskich znaków?

Wyeksportuj go jako XLSX albo pobierz CSV ze znacznikiem kolejności bajtów (BOM) - zaznacz to w karcie Format lub wybierz „UTF-8 z BOM” w eksporcie. Excel poprawnie odczyta wtedy UTF-8.

Czy radzi sobie z dużymi plikami?

Tak. Tabela rysuje tylko widoczne wiersze, więc pliki ze 100 000 wierszy pozostają szybkie przy przewijaniu, filtrowaniu i edycji.

Gdzie zapisywane są moje dokumenty?

Tylko w przeglądarce. Kliknij przycisk folderu w lewym górnym rogu (Moje dokumenty), aby je otwierać, zmieniać ich nazwy, duplikować, pobierać lub usuwać. Wyczyszczenie danych witryny w przeglądarce je usuwa, więc pobierz te, które chcesz zachować - albo pozwól edytorowi wysyłać je na własny serwer („Zapis na serwerze”). Bardzo duże pliki mogą się nie zmieścić w pamięci przeglądarki; edytor powie, gdy tak się stanie.

Czy AI może pisać w Edytorze CSV?

Tak, każda AI - ChatGPT, Claude, Gemini, Copilot lub AI w twoim narzędziu programistycznym. Kliknij „Asystent AI”, potem „Kopiuj prompt”, wklej go do swojej AI i napisz, co ma zrobić. AI odpowiada linkiem; kliknij go, a tabela pojawi się w edytorze. „Cofnij” cofa każdą zmianę.

Czy Edytor CSV coś kosztuje?

Nie. Edytor jest darmowy, bez reklam i bez rejestracji.