Perl en Español

  1. Home
  2. Tutoriales
  3. Foro
  4. Artículos
  5. Donativos
  6. Publicidad
 

Como puedo saber que contiene la fila antes del write

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Básico
Mensaje Jue Mar 16, 2006 11:41 am
malgo
Perlero Nuevo
Perlero Nuevo
Registrado: 16 Mar 2006
Mensajes: 4
Como puedo saber que contiene la fila antes del write Responder citando

Saludos a todos, tengo un archivo txt delimitados por punto y comas necesito comparar los datos para poder escribir en un u otra hoja de calculo, y nose como compararlos, por favor alguien sabe... gracias totales
Mensaje Jue Mar 16, 2006 2:09 pm
explorer
Moderador
Moderador
Registrado: 24 Jul 2005
Mensajes: 4130
Ubicación: Valladolid, España
Responder citando

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
Código:
#!/usr/bin/perl
open(my $fh, '<', 'fichero_datos.txt');
while ( my $linea = <$fh> ) {
    my ( $valor1, $valor2 ) = split(';', $linea);
    if ( $valor eq $valor ) {
        print "Los valores son iguales en la línea $.\n";
    }
}
close $fh;
Mensaje Jue Mar 16, 2006 4:01 pm
malgo
Perlero Nuevo
Perlero Nuevo
Registrado: 16 Mar 2006
Mensajes: 4
Responder citando

En realidad hago esto:
Código:
sub text_to_excel {
# %args should look something like...
# ( delimiter => "\t",
#   recordsep => "\n",
#        file => "/path/to/file.txt"
#        name => "Sheet Title" )
# the only required args are delimiter and file
 
   my @var = 0;
    my %args = @_;
    my ( $delimiter, $recordsep, $file, $name, $outfile ) =
        @args{qw( delimiter recordsep file name outfile )};
 
    $delimiter and $file or
        die "Must provide at least delimiter and file as args to" .
            "delimited_text_to_excel().";
 
    -e $file or
        die "There is no file: $file\n";
 
    open(F, "< $file") or die("Can't open $file: $!");
    $/ = $recordsep || "\n";
    my @data = <F>;
    close F;
    $/ = "\n";
 
    my $workbook  = Spreadsheet::WriteExcel->new($outfile);
 
    #my $worksheet = $workbook->addworksheet($name||'Page 1');

    # Add some worksheets
    my $procesadas = $workbook->add_worksheet("Transacciones Procesadas");
    my $pendientes = $workbook->add_worksheet("Transacciones Pendientes");
   
   my $header = $workbook->add_format(); # Add a format
    $header->set_bold();
    $header->set_size(15);
   $header->set_align('center');
   $header->set_align('vcenter');
   $header->set_font('garamond');
   

   my $borde = $workbook->addformat();    # Add a format
    $borde->set_border();

   my $format1 = $workbook->addformat();    # Add a format
    $format1->set_size(11);
   $format1->set_bold();
    $format1->set_align('left');
   $format1->set_align('vleft');
   $format1->set_font('garamond');
   
   my $format2 = $workbook->addformat();    # Add a format
   $format2->set_size(10);
    $format2->set_align('center');
   $format2->set_align('vcenter');
   $format2->set_num_format('#,##0');
   $format2->set_font('garamond');

   $worksheet->set_column('A:A',  60);
   $worksheet->set_column('B:B',  15);
   $worksheet->set_column('C:C',  15);
   $worksheet->set_column('D:D',  15);
   $worksheet->set_column('E:E',  15);
   
   for ( my $row = 0; $row < @data; $row++ )
   {
      chomp( my @line = split /$delimiter/, $data[$row] );
      
      for ( my $col = 0; $col < @line; $col++ )
      {
         if () FALTARIA COMPARAR EL (*) Q ESTA DENTRO DEL ARCHIVO TXT COMO CORTE(CAMBIO DE HOJA)
         {
            @var = 1;
         }
         
         if(@var == 1)
         {
            if ($row == 0)
            {
               $pendientes->merge_range('A1:E1', $line[$col], $header);
            }
            if ($row == 2)
            {
               $pendientes->write($row, $col, $line[$col], $format1);
            }
            if ($row > 2)
            {
               $pendientes->write($row, $col, $line[$col], $format2);
            }
         }
         else
         {
            if ($row == 0)
            {
               $procesadas->merge_range('A1:E1', $line[$col], $header);
            }
            if ($row == 2)
            {
               $procesadas->write($row, $col, $line[$col], $format1);
            }
            if ($row > 2)
            {
               $procesadas->write($row, $col, $line[$col], $format2);
            }
         }
      }
   }
   $workbook->close();
}



Muchisimas gracias por la respuesta
Mensaje Vie Mar 17, 2006 6:40 am
explorer
Moderador
Moderador
Registrado: 24 Jul 2005
Mensajes: 4130
Ubicación: Valladolid, España
Responder citando

malgo escribió:
Código:
sub text_to_excel {
# %args should look something like...
# ( delimiter => "\t",
#   recordsep => "\n",
#        file => "/path/to/file.txt"
#        name => "Sheet Title" )
# the only required args are delimiter and file

Pues en efecto, es eso.
Tu código es una función que tiene que ser llamada por ejemplo así:
Código:
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 escribió:
Código:
    open(F, "< $file") or die("Can't open $file: $!");
    $/ = $recordsep || "\n";
    my @data = <F>;
    close F;
    $/ = "\n";

    # ...

   for ( my $row = 0; $row < @data; $row++ )
   {
      chomp( my @line = split /$delimiter/, $data[$row] );
      # ...
¿Donde tienes el problema?
Mensaje Vie Mar 17, 2006 7:49 am
malgo
Perlero Nuevo
Perlero Nuevo
Registrado: 16 Mar 2006
Mensajes: 4
Responder citando

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 nose como 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 ; Nose si existe alguna forma de hacer comparaciones de cadenas con cada una de las divisiones del @line.
Gracias
Mensaje Sab Mar 18, 2006 5:54 am
explorer
Moderador
Moderador
Registrado: 24 Jul 2005
Mensajes: 4130
Ubicación: Valladolid, España
Responder citando

Inserta aqui
Código:
    for ( my $row = 0; $row < @data; $row++ ) {
        chomp( my @line = split /$delimiter/, $data[$row] );
antes del chomp, esto
Código:
        if ( $data[$row] eq '*' ) {
            # Aquí, cerrar la hoja actual
            # Aquí, abrir nueva hoja
            # ahora saltamos a la siguiente línea del fichero:
            next;
        }
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ínas 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.
Mensaje Lun Mar 20, 2006 4:45 pm
malgo
Perlero Nuevo
Perlero Nuevo
Registrado: 16 Mar 2006
Mensajes: 4
Responder citando

Ya está echo, gracias por los consejos explorer salió a la perfección, pero tengo algunas dudas todavia 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/as en el archivo y en la sentencia if por esas mismas letra/as ej. if ( $data[$row] =~/corte/ ) ahi si encuentra, será que el asterisco o algún otro simbolo tenga algun trato especial en las comparaciones de expresiones regulares? estaba leyendo los tutoriales y no creo haber leido sobre excepciones en las comparaciones!! Gracias Nuevamente...
Mensaje Lun Mar 20, 2006 4:58 pm
kidd
Creador de Perl en Español
Creador de Perl en Español
Registrado: 15 Oct 2003
Mensajes: 1389
Ubicación: México
Responder citando

Hola:

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

Código:

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


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

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

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

Código:

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



Saludos
Publicar nuevo tema   Responder al tema    Foros de discusión -> Básico Todas las horas son GMT - 6 Horas
Página 1 de 1



Powered by phpBB © 2001, 2005 phpBB Group