• Publicidad

Cómo puedo saber qué contiene la fila antes del write

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

Cómo puedo saber qué contiene la fila antes del write

Notapor malgo » 2006-03-16 12:41 @570

Saludos a todos, tengo un archivo txt delimitado por punto y comas.

Necesito comparar los datos para poder escribir en una u otra hoja de cálculo, y no sé cómo compararlos.

Por favor, alguien sabe... Gracias totales.
malgo
Perlero nuevo
Perlero nuevo
 
Mensajes: 4
Registrado: 2006-03-16 11:17 @512

Publicidad

Re: Cómo puedo saber que contiene la fila antes del write

Notapor explorer » 2006-03-16 15:09 @673

Pues con lo poco que nos has dicho, supongo que lo que hay que hacer es
  • Abrir el fichero
  • Para todas las líneas del fichero
  • Separar los valores por el punto y coma
  • Si los valores son iguales, lo sacamos por pantalla
  • Seguimos
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. open(my $fh, '<', 'fichero_datos.txt');
  3. while ( my $linea = <$fh> ) {
  4.     my ( $valor1, $valor2 ) = split(';', $linea);
  5.     if ( $valor eq $valor ) {
  6.         print "Los valores son iguales en la línea $.\n";
  7.     }
  8. }
  9. close $fh;
Coloreado en 0.005 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

Notapor malgo » 2006-03-16 17:01 @751

En realidad hago esto:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. sub text_to_excel {
  2.  
  3.     # %args should look something like...
  4.     # ( delimiter => "\t",
  5.     #   recordsep => "\n",
  6.     #        file => "/path/to/file.txt"
  7.     #        name => "Sheet Title" )
  8.     # the only required args are delimiter and file
  9.  
  10.     my @var  = 0;
  11.     my %args = @_;
  12.     my ( $delimiter, $recordsep, $file, $name, $outfile ) = @args{qw( delimiter recordsep file name outfile )};
  13.  
  14.     $delimiter and $file
  15.         or die "Must provide at least delimiter and file as args to" . "delimited_text_to_excel().";
  16.  
  17.     -e $file
  18.         or die "There is no file: $file\n";
  19.  
  20.     open( F, "< $file" ) or die("Can't open $file: $!");
  21.     $/ = $recordsep || "\n";
  22.     my @data = <F>;
  23.     close F;
  24.     $/ = "\n";
  25.  
  26.     my $workbook = Spreadsheet::WriteExcel->new($outfile);
  27.  
  28.     #my $worksheet = $workbook->addworksheet($name||'Page 1');
  29.  
  30.     # Add some worksheets
  31.     my $procesadas = $workbook->add_worksheet("Transacciones Procesadas");
  32.     my $pendientes = $workbook->add_worksheet("Transacciones Pendientes");
  33.  
  34.     my $header = $workbook->add_format();    # Add a format
  35.     $header->set_bold();
  36.     $header->set_size(15);
  37.     $header->set_align('center');
  38.     $header->set_align('vcenter');
  39.     $header->set_font('garamond');
  40.  
  41.     my $borde = $workbook->addformat();      # Add a format
  42.     $borde->set_border();
  43.  
  44.     my $format1 = $workbook->addformat();    # Add a format
  45.     $format1->set_size(11);
  46.     $format1->set_bold();
  47.     $format1->set_align('left');
  48.     $format1->set_align('vleft');
  49.     $format1->set_font('garamond');
  50.  
  51.     my $format2 = $workbook->addformat();    # Add a format
  52.     $format2->set_size(10);
  53.     $format2->set_align('center');
  54.     $format2->set_align('vcenter');
  55.     $format2->set_num_format('#,##0');
  56.     $format2->set_font('garamond');
  57.  
  58.     $worksheet->set_column( 'A:A', 60 );
  59.     $worksheet->set_column( 'B:B', 15 );
  60.     $worksheet->set_column( 'C:C', 15 );
  61.     $worksheet->set_column( 'D:D', 15 );
  62.     $worksheet->set_column( 'E:E', 15 );
  63.  
  64.     for ( my $row = 0; $row < @data; $row++ ) {
  65.         chomp( my @line = split /$delimiter/, $data[$row] );
  66.  
  67.         for ( my $col = 0; $col < @line; $col++ ) {
  68.             if () {                    # FALTARÍA COMPARAR EL (*) QUE ESTÁ DENTRO DEL ARCHIVO TXT COMO CORTE (CAMBIO DE HOJA)
  69.                 @var = 1;
  70.             }
  71.  
  72.             if ( @var == 1 ) {
  73.                 if ( $row == 0 ) {
  74.                     $pendientes->merge_range( 'A1:E1', $line[$col], $header );
  75.                 }
  76.                 if ( $row == 2 ) {
  77.                     $pendientes->write( $row, $col, $line[$col], $format1 );
  78.                 }
  79.                 if ( $row > 2 ) {
  80.                     $pendientes->write( $row, $col, $line[$col], $format2 );
  81.                 }
  82.             }
  83.             else {
  84.                 if ( $row == 0 ) {
  85.                     $procesadas->merge_range( 'A1:E1', $line[$col], $header );
  86.                 }
  87.                 if ( $row == 2 ) {
  88.                     $procesadas->write( $row, $col, $line[$col], $format1 );
  89.                 }
  90.                 if ( $row > 2 ) {
  91.                     $procesadas->write( $row, $col, $line[$col], $format2 );
  92.                 }
  93.             }
  94.         }
  95.     }
  96.     $workbook->close();
  97. }
Coloreado en 0.004 segundos, usando GeSHi 1.0.8.4


Muchísimas gracias por la respuesta.
malgo
Perlero nuevo
Perlero nuevo
 
Mensajes: 4
Registrado: 2006-03-16 11:17 @512

Re: Cómo puedo saber que contiene la fila antes del write

Notapor explorer » 2006-03-17 07:40 @361

malgo escribiste:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. sub text_to_excel {
  2. # %args should look something like...
  3. # ( delimiter => "\t",
  4. #   recordsep => "\n",
  5. #        file => "/path/to/file.txt"
  6. #        name => "Sheet Title" )
  7. # the only required args are delimiter and file
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Pues en efecto, es eso.

Tu código es una función que tiene que ser llamada por ejemplo así:

text_to_excel({delimeter=>';',file="/camino/a/tu/fichero.txt",name=>"Hoja 1");

Dentro del código veo que está lo mismo que te he puesto más arriba: abrir el fichero, y luego, línea por línea, dividir.

malgo escribiste:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1.     open(F, "< $file") or die("Can't open $file: $!");
  2.     $/ = $recordsep || "\n";
  3.     my @data = <F>;
  4.     close F;
  5.     $/ = "\n";
  6.  
  7.     # ...
  8.  
  9.         for ( my $row = 0; $row < @data; $row++ )
  10.         {
  11.                 chomp( my @line = split /$delimiter/, $data[$row] );
  12.                 # ...
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
¿Dónde tienes el problema?
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

Notapor malgo » 2006-03-17 08:49 @409

Te lo explico: dentro del archivo txt hay un asterisco (*) en medio de X cantidad de filas. Lo que pretendo hacer es colocar en una hoja Excel el primer registro hasta donde este el asterisco y continuar en otra hoja el resto de los registros hasta final del archivo.

Mi problema es que no sé cómo decirle al Perl que mientras recorra fila por fila compare con el asterisco, porque el @data es el archivo completo y el @line es un registro dividido por ';'. No sé si existe alguna forma de hacer comparaciones de cadenas con cada una de las divisiones del @line.

Gracias.
malgo
Perlero nuevo
Perlero nuevo
 
Mensajes: 4
Registrado: 2006-03-16 11:17 @512

Re: Como puedo saber que contiene la fila antes del write

Notapor explorer » 2006-03-18 06:54 @329

Inserta aquí:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
    for ( my $row = 0; $row < @data; $row++ ) {
        chomp( my @line = split /$delimiter/, $data[$row] );
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

antes del chomp(), esto:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
        if ( $data[$row] eq '*' ) {
            # Aquí, cerrar la hoja actual
            # Aquí, abrir nueva hoja
            # ahora saltamos a la siguiente línea del fichero:
            next;
        }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Como verás, ahora surge otro problema: tienes que recopiar todo el proceso de cierre y de apertura de hoja dentro de ese if()... se podría arreglar poniendo todas esas líneas como subrutinas, claro.

Otra forma de plantear el problema:
  1. Lees el fichero
  2. Lo partes en pedazos, según el '*'
  3. Par cada parte, lo mandas a la subrutina text_to_excel, pero hay que modificarla antes, para que en vez de leer de un fichero de texto, lo lea del array que le estas pasando como argumento (por ejemplo).
Y finalmente otra opción:
  1. Lees el fichero
  2. Lo partes en pedazos, según el '*' y cada parte la grabas a un fichero distinto
  3. Por cada fichero generado, se lo pasas a la subrutina text_to_excel.
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

Notapor malgo » 2006-03-20 17:45 @781

Ya está hecho, gracias por los consejos, explorer, salió a la perfección, pero tengo algunas dudas todavía con relación a la comparación de cadenas.

Al comparar el asterisco de esta forma: if ( $data[$row] =~/*/ ) no me encuentra en el archivo, pero si cambio el asterisco por una letra(s) en el archivo y en la sentencia if() por esas mismas letra(s).

Ej.: if ( $data[$row] =~/corte/ ) ahí sí encuentra.

¿Será que el asterisco o algún otro símbolo tenga algún trato especial en las comparaciones de expresiones regulares? Estaba leyendo los tutoriales y ¡¡no creo haber leído sobre excepciones en las comparaciones!!

Gracias nuevamente...
malgo
Perlero nuevo
Perlero nuevo
 
Mensajes: 4
Registrado: 2006-03-16 11:17 @512

Notapor kidd » 2006-03-20 17:58 @790

Hola.

Si quieres usar el '*' como diciendo cualquier cosa, entonces debes de poner:

$data[$row] =~/.*/

El punto significa cualquier carácter o símbolo, y el asterisco significa repetido 0 o más veces.

Para más detalles, checa los tutoriales acerca de expresiones regulares:
http://perlenespanol.com/archives-tut/c ... lares.html

Ahora, si quieres usar el asterisco literalmente, entonces debe de ser:

$data[$row] =~/\*/


Saludos
Uriel Lizama Perl programmer fundador de Perl en Español
Perl Programming Language
Avatar de Usuario
kidd
Creador de Perl en Español
Creador de Perl en Español
 
Mensajes: 1166
Registrado: 2003-10-15 16:52 @744
Ubicación: México


Volver a Básico

¿Quién está conectado?

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

cron