No data rows yet - type into the row marked + or paste cells from a spreadsheet.
No data rows yet - type into the row marked + or paste cells from a spreadsheet.
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.
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.
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.
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 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.
La tabla solo dibuja las filas que ves: los archivos con 100 000 filas siguen siendo rápidos de desplazar, filtrar y editar.
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.
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.
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}';
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
No. El editor es gratuito, sin anuncios y sin registro.