Problema: Tengo datos (principalmente en formato CSV) producidos en Windows y * nix, y procesados principalmente en * nix. Windows usa CRLF para terminaciones de línea y Unix usa LF. Para cualquier archivo en particular, no sé si tiene ventanas o finales de línea * nix. Hasta ahora, he estado escribiendo algo como esto para manejar la diferencia:¿Detecta correctamente los finales de línea de un archivo en Perl?
while (<$fh>){
tr/\r\n//d;
my @fields = split /,/, $_;
# ...
}
En * nix la parte \ n es equivalente a masticar, y, además, se deshace de \ r (CR) si es un ventanas archivo producido.
Pero ahora quiero enviar un mensaje de texto :: CSV_XS b/c Estoy empezando a obtener archivos de datos más extraños con datos entrecomillados, potencialmente con saltos de línea incrustados, etc. Para que este módulo lea dichos archivos, Text :: CSV_XS :: getline() requiere que especifique los caracteres de fin de línea. (No puedo leer cada línea como arriba, tr/\ n \ r // d, y las analiza con Text :: CSV b/c que no manejaría correctamente los saltos de línea integrados). ¿Cómo puedo correctamente detectar si un archivo arbitrario usa ventanas o terminaciones de línea de estilo * nix, por lo que puedo decir a Text :: CSV_XS :: eol() cómo chomp()?
No pude encontrar un módulo en CPAN que simplemente detecta terminaciones de línea. No quiero convertir primero todos mis archivos de datos a través de dos2unix, b/c los archivos son enormes (cientos de gigabytes), y pasar más de 10 minutos para cada archivo para hacer frente a algo tan simple parece una tontería. Pensé en escribir una función que lea los primeros cientos de bytes de un archivo y cuente los LF frente a CRLF, pero me niego a creer que esto no tiene una mejor solución.
¿Algún ayuda?
Nota: todos los archivos tienen terminaciones de línea de Windows o terminaciones * nix, es decir, no están mezclados en un solo archivo.
Gracias, nunca antes había tenido conocimiento de PerlIO. Esto es exactamente lo que necesitaba. – user1481