• Publicidad

Procesar archivo CSV

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

Procesar archivo CSV

Notapor Pac17 » 2017-03-10 23:14 @009

Hola, soy nuevo programando en Perl y estoy tratando de hacer un ejercicio. Sin embargo, necesito una guía para realizarlo, ¿podrían asesorarme?

El programa a desarrollar tiene que leer un archivo .txt con información desordenada como la siguiente:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
Nombre;Edad;Informacion1;Informacion2;Informacion3
Pedro;17;3.0;7;espanol
Juan;20;3.0;7;matematicas
Andrea;23;0;0;ciencias
;;
Mary;19;6;7.24;historia
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


La información se debe de almacenar en un array o hash, descartar los ';', espacios, etc... he logrado leer el fichero .txt y almacenar los datos en un arreglo:
@array[0] = Nombre
@array[1] = Edad
etc.

Al imprimir mi arreglo me muestra la información de corrido:
NombreEdadInformacion1Informacion2Informacion3Pedro173.07espanolJuan203.07matematicasAndrea2300cienciasMary1967.24historia

También he logrado crear un nuevo archivo .txt e imprimir la información dentro de este, sin embargo, al momento de empezar a ordenar la información me encuentro con los problemas, la información debe quedar impresa de este modo:

Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
Nombre       Edad    Informacion1     Informacion2       Informacion3
Pedro          17             3.0               7             espanol
Juan           20             3.0               7         matematicas
Andrea         23               0               0            ciencias
Mary           19            67.2               4            historia
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


¿Podría alguien orientarme en la realización de este programa? ¿Cómo podría darle ese formato de tabla a mi información localizada en un arreglo e imprimirla en el nuevo archivo .txt? ¿Hay manera de hacer un arreglo de 5 columnas sin delimitar las filas?

Agradecería muchísimo su ayuda.

¡Saludos!
Pac17
Perlero nuevo
Perlero nuevo
 
Mensajes: 2
Registrado: 2017-03-10 22:50 @993

Publicidad

Re: Procesar archivo CSV

Notapor explorer » 2017-03-11 10:48 @492

Bienvenido a los foros de Perl en Español, Pac17.

Bueno, la información del archivo está organizada en registros de una línea, y campos separados por el carácter ';'. Decimos que está desordenada por el orden de los registros, ¿no?

Para imprimir un arreglo (array) puedes usar un bucle o utilizar la ayuda del módulo Data::Dumper, pero creo que estás guardando mal la información. Si sale toda la información del archivo es que estás guardando todos los campos de todos los registros en un único nivel de profundidad, es decir: que estás perdiendo el carácter bidimensional de la información y lo estás desplegando en una sola dimensión, con lo que luego será más difícil de trabajar.

Si no quieres que salga la información de corrido, te vale con imprimir el arreglo con entrecomillado doble:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. say "@array";
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


Observando el formato de la salida, vemos que algunos campos están alineados hacia la derecha y otros a la izquierda. Te recomiendo el uso de sprintf() para hacer el formateo de la salida.

La recomendación básica es la de guardar la información en una estructura bidimensional: un arreglo de arreglos.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/env perl
  2. use v5.18;
  3.  
  4. my @array = (
  5.     [ 'Nombre',    'Edad', 'Informacion1', 'Informacion2',     'Informacion3', ],
  6.     [ 'Pedro',       '17',          '3.0',            '7',          'espanol', ],
  7.     [ 'Juan',        '20',          '3.0',            '7',      'matematicas', ],
  8.     [ 'Andrea',      '23',            '0',            '0',         'ciencias', ],
  9.     [ 'Mary',        '19',         '67.2',            '4',         'historia', ],
  10. );
  11.  
  12. for my $reg (@array) {
  13.     say sprintf "%-13s %4s %15s %15s %15s", @$reg;
  14. }
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4

Más información, en tu propio ordenador con el comando perldoc perllol, y en la Web (traducido al español).
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: Procesar archivo CSV

Notapor Pac17 » 2017-03-11 15:22 @682

¡Muchísimas gracias por tu ayuda, explorer!

He logrado acomodar la información por columnas y presentarla en pantalla y en un archivo .txt. Sin embargo, aún tengo pendiente algunas tareas. ¿Tal vez podrías ayudarme con unas pistas?

Mi código es el siguiente:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. use v5.18;
  2. use Data::Dumper;
  3. use File::Slurp;
  4. my @lineas;
  5. my @rray;
  6. my $rray;
  7. my $texto;
  8.  
  9. open FICHERO, "<input.txt" or die "ERROR: No encuentro el fichero texto.txt\n";
  10. @lineas = <FICHERO>        or die "ERROR: No puedo leer el fichero\n";
  11. open FICHERO2, ">salida1.txt" or die "ERROR: No puedo abrir el fichero salida1.txt\n";
  12. close FICHERO              or die "ERROR: No puedo cerrar el fichero\n";
  13.  
  14. foreach ( @lineas ) {
  15.   push @rray, [ split /[;\n\t]/];
  16. }
  17.  
  18.  
  19. #print Dumper(\@rray);
  20.  
  21. for my $rray (@rray)
  22. {
  23.  
  24.     printf FICHERO2 "%-13s%20s%20s%20s%20s\n", @$rray;
  25. }
  26. close FICHERO2              or die "ERROR: No puedo cerrar el fichero\n";
  27.  
  28.  
  29. my $texto = read_file('salida1.txt');
  30.  
  31. $texto=~ s/\n\n+/\n/g;
  32.  
  33.  #=~ s/\n\n+/\n/g;
  34.  
  35. write_file('salida2.txt', $texto);
  36.  
  37.  
  38.  
  39. #print FICHERO2 Dumper (\@rray);
  40.  
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4

He creado dos archivos de salida para realizar pruebas (salida1.txt y salida2.txt).
Al leer el texto de entrada como mencione anteriormente, este cuenta con algunas anormalidades: por ejemplo, dobles ';', espacios y algunos saltos de línea... En alguna parte de mi código se están reemplazando los ';' dobles por lo que parecen ser espacios y me está generando saltos de línea innecesarios o desacomodo en la información para el archivo de salida.

Intenté -sin éxito- ajustar el texto con la siguiente línea:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. $texto=~ s/\n\n+/\n/g;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


¿Hay alguna manera de eliminar los espacios extras ocasionados por los dobles ';' sin alterar la estructura actual de la información?

Una vez más te agradezco la ayuda y la bienvenida. Siento tanta pregunta dado que es mi tercer día programando en Perl.

Recibe un saludo.
Pac17
Perlero nuevo
Perlero nuevo
 
Mensajes: 2
Registrado: 2017-03-10 22:50 @993

Re: Procesar archivo CSV

Notapor explorer » 2017-03-12 14:45 @656

Es posible que el split() de la línea 15 esté agregando una línea demás, ya que le estás pidiendo que "divida" cada línea también por el carácter de fin de línea ("\n"). O, sencillamente, que no estamos quitando el carácter de fin de línea del último campo de la línea.

Entonces... lo que hay que hacer es: 1- ponemos un chomp() antes de esa línea para asegurarnos que no contiene finales de línea. Y 2- quitamos "\n" del split(), porque no hace falta.
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. open FICHERO, "<input.txt" or die "ERROR: No encuentro el fichero texto.txt\n";
  2. my @lineas = <FICHERO>     or die "ERROR: No puedo leer el fichero\n";
  3. close FICHERO              or die "ERROR: No puedo cerrar el fichero\n";
  4.  
  5. foreach ( @lineas ) {
  6.   chomp;
  7.   push @rray, [ split /[;\t]/];
  8. }
Coloreado en 0.001 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


Volver a Básico

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado