• Publicidad

Extracion de datos de un archivo plano

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

Extracion de datos de un archivo plano

Notapor JoshZeta » 2015-09-02 14:58 @665

Buenas tardes con todos :D

Tengo un problema al extraer columnas con datos de un archivo plano. El archivo es el siguiente :
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
(1 row affected)
(1 row affected)
(1 row affected)
(1 row affected)
(1 row affected)

|deviceID   |measuringObject|collectionEndTime  |taskID     |insertionTime      |granularityPeriod|Time10             |row_index  
|-----------|---------------|-------------------|-----------|-------------------|-----------------|-------------------|-----------
|    4722691|825            |2015/07/06 10:00:00|        168|2015/07/06 09:52:00|               60|2015/07/06 10:00:00|     933114
|    4722691|936            |2015/07/06 10:00:00|        168|2015/07/06 09:52:00|               60|2015/07/06 10:00:00|     933115
|    4722691|2417           |2015/07/06 10:00:00|        168|2015/07/06 09:52:00|               60|2015/07/06 10:00:00|     933116
|    4722691|2903           |2015/07/06 10:00:00|        168|2015/07/06 09:52:00|               60|2015/07/06 10:00:00|     933117
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


Yo deseo extraer solo determinadas columnas (deviceID, insertiontime, row_index) e insertarlas en un archivo csv.

Para esto pensaba usar el siguiente código:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my $nombre_archivo_fuente = "/home/osboxes/Desktop/CN1/OFDOG_data.out";
  2. my $SALIDA = "salida.txt";
  3.  
  4. open my $FORMAT_FONT, '<',$nombre_archivo_fuente;
  5. open my $FORMAT_DO, '>', $SALIDA;
  6.  
  7. my $i = 0 ;
  8.  
  9. while (my $registro = <$FORMAT_FONT>{
  10. next if $. == 1 ;
  11. next if $. == 2 ;
  12. next if $. == 3 ;
  13. next if $. == 4 ;
  14. next if $. == 5 ;
  15. next if $. == 6 ;
  16. next if $. == 7 ;
  17. chomp $registro ;
  18. my @campos = split("|", $registro);
  19. my $archivo_final = join ',',@campos[0,4,7];
  20. print $FORMAT_DO "$archivo_final\n";
  21. $i++;
  22. }
  23.  
  24. close $FORMAT_FONT;
  25. close $SALIDA;
  26.  
  27. my $pathsalida = "/home/osboxes/Desktop/CN2";
  28. copy ($SALIDA, $pathsalida);
  29. chmod 0777, "/home/osboxes/Desktop/CN2/$SALIDA" ;
  30. unlink $SALIDA;
  31.  
  32. print "\n\t Operación realizada con éxito: $i registros procesados del archivo $archivo_final.\n";
  33.  
Coloreado en 0.004 segundos, usando GeSHi 1.0.8.4

El código aparentemente funciona bien porque el print() indica la cantidad de registros correspondiente al archivo plano; pero el contenido del archivo final sale en blanco. Please, Help Me... :roll:
JoshZeta
Perlero nuevo
Perlero nuevo
 
Mensajes: 13
Registrado: 2015-08-20 11:40 @527

Publicidad

Re: Extracion de datos de un archivo plano

Notapor explorer » 2015-09-05 02:16 @136

Había problemas en el código: Faltaba un paréntesis, no se cerraba $FORMAT_DO, la presencia de un '|' inicial en el archivo de entrada obliga a renumerar las columnas una posición más.

Pero el problema principal estaba en el split(): hay que recordar que el primer argumento de split() es el delimitador, que es un patrón de expresiones regulares, no una cadena de caracteres, así que "|" realmente es un patrón. Y en un patrón, el carácter '|' sí que tiene un significado: es el de alternancia. Por eso no se realizaba bien la partición de las columnas.

La solución es indicar que el carácter '|' realmente no es alternancia, sino un carácter normal.

Esta es la versión corregida:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/env perl
  2. use strict;
  3. use warnings;
  4. use autodie;
  5. use feature 'say';
  6.  
  7. my $archivo_fuente = "code_38870.txt";
  8. my $archivo_salida = "code_38870.csv";
  9.  
  10. #               deviceID insertiontime row_index
  11. my @columnas = (1,       5,            8,       );
  12.  
  13.  
  14. open my $FORMAT_FONT, '<', $archivo_fuente;
  15. open my $FORMAT_DO,   '>', $archivo_salida;
  16.  
  17. my $i = 0;
  18.  
  19. while (my $registro = <$FORMAT_FONT>) {
  20.  
  21.     next if $registro !~ m/^ [|] \s* \d+/x;             # saltamos a la siguiente línea si no es un registro
  22.  
  23.     chomp $registro ;
  24.  
  25.     my @campos = split /\s*[|]\s*/, $registro;          # extraemos @campos
  26.  
  27.     say $FORMAT_DO join ',', @campos[@columnas];        # y sacamos de @campos las @columnas que nos interesan
  28.  
  29.     $i++;
  30. }
  31.  
  32. close $FORMAT_FONT;
  33. close $FORMAT_DO;
  34.  
  35. say "\n\tOperación realizada con éxito: $i registros procesados del archivo $archivo_salida.";
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4

Más información en perldoc -f split
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: Extracion de datos de un archivo plano

Notapor JoshZeta » 2015-09-08 11:54 @537

¡¡Gracias, explorer!! Estaba dando vueltas sobre lo mismo, pero ahora sí me quedó muy claro sobre "|" y su significado como carácter de alternancia. :wink:
JoshZeta
Perlero nuevo
Perlero nuevo
 
Mensajes: 13
Registrado: 2015-08-20 11:40 @527


Volver a Básico

¿Quién está conectado?

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