• Publicidad

Cuál es la mejor forma para leer CSV

¿Apenas comienzas con Perl? En este foro podrás encontrar y hacer preguntas básicas de Perl con respuestas aptas a tu nivel.

Cuál es la mejor forma para leer CSV

Notapor Skull118 » 2013-11-21 12:49 @575

Buenos días, compañeros, me presento nuevamente a este foro, debido a que presento un problema algo enredado del cual no he podido crear una solución, les trataré de explicar.

Tengo X cantidad de archivos CSV los cuales contienen 11 columnas de información, pero algunas columnas vienen algo así:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
  1. dato1,dato2,"dato3, dato extra que va siempre dentro del dato "3" algunas veces dentro del datoX vienen comas o bien comillas o saltos de línea ",dato4,etc.,etc.
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

O bien vienen así:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
  1. dato1,dato2,dato3,dato4,"Aquí viene el dato5
  2. con saltos de linea,
  3. comas
  4. puntos y comas;
  5. múltiples líneas,
  6. etc
  7. ",dato6,etc.,etc.
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

¿De qué manera podría procesar esta información?

Muchas gracias de antemano.
Skull118
Perlero nuevo
Perlero nuevo
 
Mensajes: 53
Registrado: 2013-03-21 13:38 @610

Publicidad

Re: Cuál es la mejor forma para leer CSV

Notapor explorer » 2013-11-21 14:31 @646

Pues... bastante mal...

Si los campos contienen caracteres de fin de línea, no se distinguen de los caracteres de fin de línea que separan registros.

Ahora bien... si dices que siempre son 11 campos... se podría intentar un apaño:

* leemos una línea y la añadimos a una variable temporal
* si la línea no contiene 11 campos, pasamos a la siguiente vuelta
* si tiene 11 campos, la procesamos y vaciamos la variable temporal
* repetimos para todo el archivo
* al final, procesamos el último registro que quede en la variable temporal, si lo hubiera.

También, lo que complica el problema, es la presencia de comas dentro de los mismos campos.

Hay módulos que permiten leer este tipo de archivos, como Text::CSV.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Cuál es la mejor forma para leer CSV

Notapor Skull118 » 2013-11-22 12:32 @564

Estuve realizando un pequeño script para ello, utilizando TEXT::CSV, sin embargo, las líneas que presentan saltos de línea dentro del registro 10, también resultan problema para este módulo :? , por ende no he encontrado la forma de realizarlo :cry: .

Lo del apaño, está muy buena la idea, no se me había ocurrido :shock: , si puedo realizarlo, lo compartiré con la comunidad :D , gracias por la idea, explorer :wink:
Skull118
Perlero nuevo
Perlero nuevo
 
Mensajes: 53
Registrado: 2013-03-21 13:38 @610

Re: Cuál es la mejor forma para leer CSV

Notapor explorer » 2013-11-22 12:54 @579

Para que Text::CSV pueda leer registros con caracteres de nueva línea, debe activarse el modo "binario" de ese módulo. ¿Lo hiciste?
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Cuál es la mejor forma para leer CSV

Notapor Skull118 » 2013-11-22 16:31 @730

Afirmativo

Sintáxis: [ Descargar ] [ Ocultar ]
  1.  
  2. use strict; 
  3. use TEXT::CSV; 
  4. my @a=glob("*.csv"); 
  5. foreach$a(@a){ 
  6.     my $sum=0;     
  7.     my $csv = Text::CSV->new({    binary => 1,                                  
  8.                     eol => $/ 
  9.                 }); 
  10.     open(my $data, '<' , $a) or die "NO SE PUEDE ABRIR $a $! \n";     
  11.     while (my $row = $csv->getline ($data)){ 
  12.        for(my $x=0; $x<scalar(@$row); $x++){ 
  13.          print(@$row[1]); 
  14.        } 
  15.     } 
  16.  
  17.  
Skull118
Perlero nuevo
Perlero nuevo
 
Mensajes: 53
Registrado: 2013-03-21 13:38 @610

Re: Cuál es la mejor forma para leer CSV

Notapor explorer » 2013-11-22 17:26 @768

Pues... el caso es que a mi sí me funciona:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use v5.16;                      # activar las nuevas característicos
  3. use autodie;                    # «Es mejor morir que regresar con deshonor» --proverbio Klingon
  4.  
  5. use Text::CSV;
  6.  
  7. my $csv = Text::CSV->new({
  8.         binary => 1,                                  
  9.         eol    => $/,
  10. });
  11.  
  12. open my $DATA, '<', 'kk.csv';
  13.  
  14. while (my $row = $csv->getline($DATA)){
  15.     say '-' x 50;
  16.     say 'Campos: ', scalar @$row;
  17.  
  18.     for my $x ( @$row ) {
  19.         print "[$x]";
  20.     }
  21.  
  22.     say;
  23. }
  24.  
  25. close $DATA;
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4
Con este archivo:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
dato1,dato2,dato3,dato4,"Aquí viene el dato5
con saltos de linea,
comas
puntos y comas;
múltiples líneas,
etc.
",dato6,dato7,dato8,dato9,"dato10
con nuevas líneas",dato11
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4
sale:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
--------------------------------------------------
Campos: 11
[dato1][dato2][dato3][dato4][Aquí viene el dato5
con saltos de linea,
comas
puntos y comas;
múltiples líneas,
etc.
][dato6][dato7][dato8][dato9][dato10
con nuevas líneas][dato11]
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Cuál es la mejor forma para leer CSV

Notapor Skull118 » 2013-11-25 14:55 @663

Compañero, fíjate que ya lo logré procesar. El inconveniente que tenía, es que le estaba poniendo un parámetro incorrecto, el parámetro era quote_char. Lo tenía como:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. quote_char=>"'"
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Razón por la cuál, me registraba problema. Gracias de antemano.
Skull118
Perlero nuevo
Perlero nuevo
 
Mensajes: 53
Registrado: 2013-03-21 13:38 @610

Re: Cuál es la mejor forma para leer CSV

Notapor danimera » 2013-12-04 15:52 @702

La mejor forma de leer un CSV es usando DBD::CSV y usarlo como si fuera una tabla de base de datos SQL,
trabajo de esta forma a diario. Lo recomiendo :D
100% Telch - Perl Web Programming
Cali PerlMongers: http://cali.pm.org
Avatar de Usuario
danimera
Perlero frecuente
Perlero frecuente
 
Mensajes: 871
Registrado: 2005-06-23 19:02 @834
Ubicación: Colombia


Volver a Básico

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 2 invitados