Oct 232013
 
Artículo Perl

El formato CSV es uno de los formatos más habituales para el intercambio de información tabular entre distintos sistemas.

En este artículo vemos cómo leer, procesar y escribir ficheros en este formato.

El formato CSV

El nombre CSV corresponde a las siglas en inglés de “Comma Separated Values” (Valores separados por comas).

Pero también se utiliza como una denominación genérica para otros formatos similares, como el formato de valores separados por tabulaciones (TSV, Tab Separated Values).

Un fichero en formato CSV consta de una serie de líneas, cada una de las cuales contiene un registro, que a su vez consta de una serie de campos.

Es habitual que la primera línea del fichero sea una línea de cabecera, que contiene los nombres de los campos.

Ejemplo de fichero CSV:

Nombre,Apellidos,Edad,Oficio
Pedro,Fernandez,28,Fontanero
Enrique,Villalba Carrion,43,Electricista
...

En principio, parece un formato muy sencillo de procesar, pero hay que tener en cuenta algunos casos especiales:

Campos con comas, comillas y saltos de línea

En el caso de que un valor de un campo de texto contenga una coma, se encierra el valor entre comillas. Si algunos de los caracteres del valor son comillas, cada una de ellas se duplica:

Nombre,Apellidos,Edad,Oficio
Pedro,Fernandez,28,"Fontanero, Cerrajero"
Enrique,Villalba Carrion,43,"Electricista ""Pintor"""
...

Por último, también puede ocurrir que el valor de un campo contenga saltos de línea. En este caso, también se encierra el valor entre comillas:

Nombre,Apellidos,Edad,Oficio
Pedro,Fernandez,28,"Fontanero,
Cerrajero"
Enrique,Villalba Carrion,43,"Electricista ""Pintor"""
...

En el ejemplo, vemos que el registro correspondiente a Pedro Fernandez ocupa dos líneas, porque el valor del campo Oficio contiene un salto de línea.

Lectura de un fichero CSV en Perl

En perl podemos utilizar el módulo “Text::CSV” para leer un fichero CSV, teniendo en cuenta todos los casos especiales.

Para leer un fichero “prueba.csv” se puede utilizar el siguiente código:

use Text::CSV;

 my $csv = Text::CSV->new ( { binary => 1 } )  # siempre conviene poner el atributo binario
                   or die "Error creando objeto CSV: ".Text::CSV->error_diag ();

 open my $fh, "<:encoding(utf8)", "prueba.csv"
                    or die "Error leyendo fichero CSV: $!";
 my $linea = <$fh>; # Saltar la primera línea, que contiene el encabezado con los nombres
 while ( my $registro = $csv->getline( $fh ) ) {
     # Procesar registro.
     # Los valores de los campos están en $registro->[0], $registro[1], etc...
 }
 $csv->eof or $csv->error_diag();
 close $fh;

Lectura de un fichero que utiliza como separador de campos el tabulador u otro carácter

El módulo Text::CSV también permite leer ficheros que utilizan como separador de campos el carácter tabulador (“\t”), el carácter “pipe” (“|”), u otro carácter. Para ello, basta con especificar el parámetro “sep_char” al crear el objeto, dándole como valor el carácter separador a emplear. Por ejemplo, para leer un fichero TSV:

my $csv = Text::CSV->new ( { binary => 1, sep_char => "\t" } )

parámetros quote_char y escape_char

Como hemos comentado, la doble comilla es el carácter que se utiliza por defecto para encerra un valor que contiene en su interior el carácter separador. Si además la doble comilla aparece también en el valor del campo, se duplica precediéndola de otra comilla.

Este comportamiento se puede modificar con los parámetros quote_char y escape_char. Por ejemplo, si el valor de un campo en el fichero a leer es:

‘El mosquetero es d\’Artagnan’

Vemos que el caracter que encierra el valor es la comilla simple, y que el carácter que precede a una comilla simple en el interior del valor es el “backslash”.

Parar procesar correctamente un fichero de este tipo, creamos el objeto Text::CSV como:

my $csv = Text::CSV->new ( { binary => 1, quote_char => "'", escape_char => "\\" } )

Escribir un fichero CSV

El módulo Text::CSV se puede utilizar también para generar un fichero CSV. El objeto Text::CSV se encarga de utilizar los caracteres especificados por los parámetros quote_char y escape_char cuando sea necesario, para asegurar que el fichero es sintácticamente correcto.

Si los datos a escribir en formato CSV están en un array @registros, cada uno de cuyos valores es una referencia a un array que contiene los valores de un registro, el fichero CSV se genera simplemente con las sentencias:

 # Especificar el fin de línea como CR+LF 
 $csv->eol ("\r\n");

 # Abrir el fichero "nuevo.csv"
 open $fh, ">:encoding(utf8)", "nuevo.csv" or die "nuevo.csv: $!";
 $csv->print ($fh, $_) for @registros;
 close $fh or die "nuevo.csv: $!";

Indice de artículos sobre programación en lenguaje Perl

 Publicado por en 3:10 pm

 Deja un comentario

(requerido)

(requerido)