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

Edita archivos CSV online, como tabla y como texto

El Editor de CSV muestra el CSV sin procesar y la tabla uno al lado del otro. Edita una celda en la tabla y el editor cambia exactamente ese campo en el texto: las demás comillas, el separador y los finales de línea se quedan como estaban. Un clic en la tabla muestra el campo en el texto, y el cursor en el texto muestra su celda. Así corriges rápidamente exportaciones de tiendas, bancos y bases de datos, limpias listas de direcciones o preparas datos para importarlos.

Todo se ejecuta en tu navegador. Los archivos no se suben, no hay registro ni publicidad.

Lo que puede hacer el editor

Como una hoja de cálculo

Escribe en las celdas, muévete con las flechas y Tab, copia y pega rangos desde y hacia Excel, LibreOffice o Google Sheets, añade, elimina y mueve filas y columnas.

Cualquier CSV

Coma, punto y coma, tabulador o barra vertical como separador, detectado automáticamente; con o sin fila de encabezado; UTF-8 con o sin BOM y Windows-1252; se conservan los finales de línea de Windows y Unix.

Encuentra lo que está roto

Filas con un número de campos distinto, comillas que nunca se cierran, nombres de columna vacíos o repetidos: listados con su línea, a un clic.

Ordena, filtra, mira más de cerca

Ordena y filtra la vista sin tocar el archivo, u ordena los propios datos. El panel de columna muestra el tipo de valores, los vacíos y los distintos, la suma y la media.

Archivos grandes

La tabla solo dibuja las filas que ves: los archivos con 100 000 filas siguen siendo rápidos de desplazar, filtrar y editar.

Exportar

Libro de Excel (XLSX), tablas JSON, Markdown y HTML, TSV, o CSV con otro separador y otra codificación, con protección contra fórmulas de hojas de cálculo.

Cómo funciona

  1. Abre: suelta un archivo CSV en la ventana, ábrelo con «Abrir archivo…» o empieza con una plantilla en «Nuevo».
  2. Edita: cambia celdas en la tabla o el texto de la izquierda; uno sigue al otro. Usa «Insertar» para filas y columnas, «Formato» para el separador.
  3. Guarda: descarga el CSV tal cual, o expórtalo como XLSX, JSON, Markdown o HTML.

Usa el editor en tu propio sitio web

Cualquier página https (y localhost) puede integrar el editor con un <iframe> y ?embed=1, sin registro y sin clave. Integrado, el editor oculta este texto y muestra un botón Guardar. Hay dos formas de meter y sacar la tabla.

1. Abrir un archivo desde un enlace, guardar en tu servidor

src= abre un archivo (tu servidor debe permitir CORS), webhook= hace que «Guardar» (Ctrl+S) envíe el documento a esa dirección. Añade &token=… para una cabecera Authorization: Bearer … y &auto para guardar después de cada cambio.

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

El webhook recibe un POST con JSON { editor: "csv", event: "save", id, name, content, updated }. Un pequeño script PHP que lo guarda:

<?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. Tu página guarda el documento (postMessage)

El editor dice csveditor:ready, tu página responde con csveditor:load, el editor informa con csveditor:loaded, con csveditor:change en cada edición real y con csveditor:save cuando el usuario guarda. Tu página puede enviar csveditor:get (el estado actual) o csveditor:save (pulsar Guardar). Así el guardado pasa por tu propio inicio de sesión y tu sesión.

<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') {               // el editor está listo: pásale el documento
    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';   // una edición real
  if (m.type === 'csveditor:save') {                // el usuario hizo clic en «Guardar»
    await fetch('/api/save', { method: 'POST', headers: { 'Content-Type': 'application/json' },
      body: JSON.stringify({ name: m.name, content: m.content }) });
    document.title = 'Saved';
  }
});

// Un botón de guardar en tu propia página: la respuesta llega como csveditor:save
function saveNow() { ed.contentWindow.postMessage({ type: 'csveditor:get' }, ORIGIN); }
</script>

Asistente de IA dentro de tu página: también funciona en el marco. Con allow="clipboard-write" en el iframe, «Copiar prompt» usa el portapapeles directamente (si no, el editor recurre al antiguo comando de copiar o muestra el prompt para copiarlo a mano). Un enlace que envía la IA no puede llegar a un editor dentro de otro sitio web, así que el editor indica a la IA y al usuario que peguen la respuesta completa de la IA en el editor, o que abran el editor en una ventana propia.

3. En una ventana propia

window.open("https://csv.giit.ch/?embed=window", "csveditor-17") abre el editor completo en su propia ventana y usa los mismos mensajes con window.opener. Ahí sí le llegan los enlaces de una IA. csveditor:load también puede llevar context: { host, title, rules } (el prompt de IA dice entonces a dónde pertenece el documento y sigue tus reglas) y hook: { url, token }, un webhook solo para este documento que nunca se guarda. Al cerrar la ventana con cambios sin guardar se envía csveditor:closing.

4. IA a través de tu propio servidor

Pasa al editor tu propio prompt, una dirección en tu sitio y una clave para esta sesión del editor. El diálogo de IA muestra entonces «Conectado a» tu sitio, lo que le dices a la IA y la opción cambiar el documento actual o crear uno nuevo; Copiar prompt lo junta todo. La IA envía su resultado con la clave a tu servidor, y tu página lo abre en el editor: un documento nuevo se abre aparte y se queda en el navegador del usuario. Una clave por sesión del editor: sigue siendo válida mientras el editor esté abierto, y solo mientras no tenga ninguna el editor la pide con csveditor:key-request. El editor nunca envía la clave por sí mismo ni la guarda; la dirección debe ser https en tu propio host o en un subdominio suyo.

const key = async () => (await fetch('/api/ai-key.php?doc=17')).json();   // una clave por sesión del editor
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);
// recuerda el id de csveditor:loaded e ignora change/save/closing con otro id
// solo mientras el editor no tenga clave:
if (m.type === 'csveditor:key-request') { const k = await key(); ed.contentWindow.postMessage({ type: 'csveditor:ai', key: k.key }, ORIGIN); }
// mientras el editor esté abierto, avisa a tu servidor cada minuto; cerrar el editor o la página anula la clave
setInterval(() => fetch('/api/ai-key.php?alive=' + k.key.slice(0, 8)), 60000);
// tu servidor tiene un resultado (polling, SSE …): target es «current» o «new»
ed.contentWindow.postMessage({ type: 'csveditor:load', name: 'Products', content: draft, from: 'ai', target }, ORIGIN);

Crea claves con al menos 128 bits aleatorios, guarda solo su hash, vincula cada una al usuario con sesión iniciada, al documento y a esta sesión del editor, crea una por sesión, mantenla válida solo mientras tu página informe de que la sesión está abierta, y anúlala cuando se cierre el editor o la página.

El protocolo completo está en llms.txt: dáselo a una IA y construirá la conexión para tu sistema. Los demás editores de giit funcionan igual con su propio prefijo, por ejemplo el Editor de LaTeX con latexeditor:: latex.giit.ch.

Preguntas frecuentes

¿Se sube mi archivo CSV?

No. El editor se ejecuta por completo en tu navegador. Tus archivos nunca se envían a un servidor, salvo que tú mismo configures un webhook a tu propio servidor.

¿Cambia el editor mi archivo cuando edito una celda?

Solo esa celda. El editor escribe el cambio en el texto CSV exactamente donde está el campo y deja el resto como estaba: las demás comillas, el separador y los finales de línea se quedan. Un campo solo se pone entre comillas cuando lo necesita.

Mi CSV usa punto y coma: ¿funciona?

Sí. El editor detecta coma, punto y coma, tabulador y barra vertical como separador; también puedes elegirlo en Formato. Convertir cambia el archivo a otro separador.

¿Cómo abro el CSV en Excel sin que se rompan las tildes y la ñ?

Expórtalo como XLSX, o descarga el CSV con marca de orden de bytes (BOM): márcalo en Formato o elige «UTF-8 con BOM» en la exportación. Así Excel lee bien el UTF-8.

¿Puede con archivos grandes?

Sí. La tabla solo dibuja las filas que ves, así que los archivos con 100 000 filas siguen siendo rápidos de desplazar, filtrar y editar.

¿Dónde se guardan mis documentos?

Solo en tu navegador. Haz clic en el botón de carpeta arriba a la izquierda (Mis documentos) para abrirlos, renombrarlos, duplicarlos, descargarlos o eliminarlos. Si borras los datos del sitio en tu navegador, desaparecen; descarga los que quieras conservar, o deja que el editor los envíe a tu propio servidor («Guardar en servidor»). Puede que los archivos muy grandes no quepan en el almacenamiento del navegador; el editor te avisa si pasa.

¿Puede una IA escribir en el Editor de CSV?

Sí, cualquier IA: ChatGPT, Claude, Gemini, Copilot o la IA de tu herramienta de programación. Haz clic en «Asistente de IA» y luego en «Copiar prompt», pégalo en tu IA y dile qué debe hacer. La IA responde con un enlace; haz clic en él y la tabla aparece en tu editor. «Deshacer» revierte cada cambio.

¿Cuesta algo el Editor de CSV?

No. El editor es gratuito, sin anuncios y sin registro.