El blog de Shackra

Catolicismo Emacs Software libre

“No seas tan abierto de mente o tu cerebro se caerá” ~G.K. Chesterton

Caracteres de nueva linea de Windows en archivos de texto, ugh

Biblia sacra - Lettre B ornée de la tête d'un hybride zoomorphe

Hoy por la mañana recibí unos archivos de texto de una cliente residente en Italia. Ella necesitaba dividir dos archivos de texto en una linea por archivo, los archivos resultantes debían permanecer dividíos en diferentes carpetas.

"Pan comido" —pensé— "ahí tengo split, dividir esos dos archivos en 1300 archivos de texto sera cualquier cosilla". Descargue los archivos de texto, corrí split, y me lleve una muy mala sorpresa: en la carpeta había sólo un archivo extra.

No pude evitar exclamar "dafuq". ¿Qué podría estar yendo mal? decidí revisar el archivo de texto original con less, para mi sorpresa el archivo contenía una sola linea de texto.

Al momento de alcanzar tal descubrimiento, decidí inspeccionar el archivo nuevamente, esta vez visitándolo con —wait for it— ¡EMACS!. La situación no podía ser más bizarra, el archivo de texto estaba conformado por varias hileras de texto, no por una sola monolítica linea como less me había mostrado.

Concluí que Emacs, por ser un editor de texto muy, pero muy, pero muy experimentado en sus menesteres, iba a mostrar correctamente (léase: cómo el usuario espera que sea mostrado) el contenido de los archivos visitados, y técnicamente, less también estaba mostrando el contenido de forma correcta, lo mismo para split.

Entonces acá estábamos sufriendo lo que en el siglo XXI se conoce como un problema de comunicación, aunque con éste siglo el problema no recae en las obstrucciones de las vías para comunicarse con el prójimo, el problema más bien surge en el valor de lo comunicado.

Necesitaba hacerme entender con split, ahí están los saltos de linea; divide. Al principio tuve la absurda idea que dos2unix iba a resolver mi problema más pronto que un desafortunado usuario terminaría de escribir sudo rm -rf /. Luego de ejecutar el comando dos2unix no habían cambios visibles, less seguía mostrando un sólo hilo de texto y split dividiendo el archivo original en un solo archivo.

Traté de reemplazar todas las instancias del carácter de nueva linea en ambos archivos, usando Emacs, pero M-x replace-string C-y RET C-q C-j fue igualmente inútil que correr dos2unix.

Luego de dos minutos meditando una posible solución a mi problema, para finalmente dividir los dos archivos de texto y entregar los resultados a mi cliente de Italia, me vino a la mente la idea de usar el comando set-buffer-file-coding-system de Emacs. Mi teoría era que si Emacs lograba mostrar correctamente el contenido del archivo visitado, al cambiar la codificación del archivo a algo que split pudiera entender resolvería el problema.

M-x set-buffer-file-coding-system RET unix RET y ¡Boom!, problema resuelto.

/