macos excel perl unix newline

macos - Excel guarda los archivos delimitados por tabuladores sin nueva línea(UNIX/Mac os X)



perl newline (4)

Este es un problema común que tengo y mi solución es un poco descarada. Así que estoy buscando una solución rápida y una explicación del problema.

El problema es que cuando decido guardar una hoja de cálculo en Excel (mac 2011) como un archivo delimitado por tabulaciones, parece que lo hace perfectamente bien. Hasta que trato de analizar el archivo línea por línea usando Perl. Por alguna razón, absorbe todo el documento en una sola línea.

Mi solución brutal es abrir el archivo en un navegador web y copiar y pegar la información en el archivo delimitado por pestañas en TextEdit (nunca uso formato de texto enriquecido). Intenté introducir una nueva línea al final del archivo antes de hacer esta corrección y no resuelve el problema.

¿Que está pasando aqui? Una explicación sería apreciada.

~ Gracias! ~


El problema son los códigos de caracteres reales que definen nuevas líneas en diferentes sistemas. Los sistemas Windows comúnmente usan un CarriageReturn + LineFeed (CRLF) y los sistemas * NIX usan solo un LineFeed (LF).

Estos caracteres se pueden representar en RegEx como / r / n o / n (respectivamente).

A veces, para hacer un hash a través de un archivo de texto, es necesario analizar los caracteres de Nueva Línea. Intente esto para DOS-to-UNIX en perl :

perl -pi -e ''s//r/n//n/g'' input.file

o, para UNIX-to-DOS usando sed :

$ sed ''s/$''"/`echo ///r`/" input.txt > output.txt

o, para DOS-a-UNIX usando sed :

$ sed ''s/^M$//'' input.txt > output.txt


Encontré una solución bastante simple para esto. Copie los datos de Excel al portapapeles, péguelos en una hoja de cálculo de Google. Descargue el archivo de hoja de cálculo de Google como ''valores separados por tabulaciones .tsv''. Esto soluciona el problema y tiene delimitadores de tabulación con un final de línea para cada línea.


Otra solución más ...

  • para un archivo delimitado por tabulaciones, guarde el documento como un tipo de archivo de Windows Formatted Text (.txt)
  • para un archivo separado por comas, guarde el documento como un tipo de archivo `Windows Comma Separated (.csv) ''

Perl tiene un patrón de expresión regular útil /R que coincidirá con cualquier final de línea común. En realidad, coincide con cualquier espacio en blanco vertical, igual que /v , o con la combinación CR LF, por lo que es lo mismo que /r/n|/v

Esto es útil aquí porque puede absorber todo su archivo en un solo escalar y luego split //R/ , lo que le dará una lista de registros de archivos, ya chomp (si desea mantener los terminadores de línea, puede split //R/K/ lugar

Otra opción es el módulo PerlIO::eol . Proporciona una nueva capa Perl IO que normalizará los finales de línea sin importar el contenido del archivo.

Una vez que haya cargado el módulo con use PerlIO::eol , puede usarlo en una declaración open

open my $fh, ''<:eol(LF)'', ''myfile.tsv'' or die $!;

o puede usar el pragma open para establecerlo como la capa predeterminada para todos los manejadores de archivos de entrada

use open IN => '':raw:eol(LF)'';

que funcionará bien con un archivo de entrada desde cualquier plataforma