• Publicidad

Leer archivo de Excel e importar columnas a nuevo archivo

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

Leer archivo de Excel e importar columnas a nuevo archivo

Notapor MGRnovel » 2010-04-06 06:17 @303

Hola a todos.

Soy nueva en esto del Perl, y en general en el tema de programación. Tengo que hacer un script en Perl que lea dos archivos de Excel, cada uno de ellos con 'n' columnas, y luego ir cogiendo las columnas 1 de cada uno de los dos archivos, las 2, las 3, hasta las 'n', e ir creando nuevos archivos con ellas, hasta finalmente tener 'n' archivos con dos columnas cada una.

Espero vuestra ayuda.
Muchas gracias
MGRnovel
Perlero nuevo
Perlero nuevo
 
Mensajes: 9
Registrado: 2010-04-06 05:31 @271

Publicidad

Re: Leer archivo de Excel e importar columnas a nuevo archivo

Notapor panterozo » 2010-04-06 07:45 @365

Hola MGRnovel...

Hace poco estuve en las mismas que tu, y hay un módulo (Spreadsheet::ParseExcel)en perl que facilita la vida ;)

Copiado y pegado de perldoc:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl -w
  2.  
  3. use strict;
  4. use Spreadsheet::ParseExcel;
  5.  
  6. my $parser   = Spreadsheet::ParseExcel->new();
  7. my $workbook = $parser->parse('Book1.xls');#Aqui se lee el Excel
  8.  
  9. if ( !defined $workbook ) {
  10.     die $parser->error(), ".\n";
  11. }
  12.  
  13. for my $worksheet ( $workbook->worksheets() ) {
  14.  
  15.     my ( $row_min, $row_max ) = $worksheet->row_range();
  16.     my ( $col_min, $col_max ) = $worksheet->col_range();
  17.  
  18.     for my $row ( $row_min .. $row_max ) {#Recorre el Excel
  19.         for my $col ( $col_min .. $col_max ) {#Lo mismo
  20.  
  21.             # Se obtienen la posición de la celda a la cual sacarás
  22.             # más adelante con $cell->value() el respectivo valor
  23.             my $cell = $worksheet->get_cell( $row, $col );
  24.             next unless $cell;
  25.  
  26.             # Se obtiene el valor de las celdas (0,0),(0,1),(0,2)...(n,n)
  27.             print "Row, Col    = ($row, $col)\n";
  28.             print "Value       = ", $cell->value(),       "\n";
  29.  
  30.             print "\n";
  31.         }
  32.     }
  33. }
  34.  
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4



Una vez que obtengas el valor de las filas o columnas, basta con guardar en un archivo de esta forma, con el módulo Spreadsheet::Write:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my $sp=Spreadsheet::Write->new(
  2.     file        => 'Archivo.xls',#Se crea un nuevo archivo excel
  3.     styles      => {
  4.         header  => { font_weight => 'bold' },
  5.     },
  6. );
  7. $sp->addrow(
  8.     { content => 'Numero', font_weight => 'bold' },
  9.     #Le das las cabeceras (cuentos quieras, en tu caso serían solo dos)
  10.     { content => 'Nombre ', font_weight => 'bold' },
  11.     { content => 'Titular', font_weight => 'bold' },
  12.     { content => 'Fecha', font_weight => 'bold' }
  13. );
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


y luego para llenar este archivo:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. $sp->addrow('columna0','columna1','columna2','columna3');
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Espero te sirva ;)
panterozo
Perlero nuevo
Perlero nuevo
 
Mensajes: 160
Registrado: 2010-01-26 08:36 @400

Re: Leer archivo de Excel e importar columnas a nuevo archivo

Notapor MGRnovel » 2010-04-06 10:00 @458

¡Muchísimas gracias!

Me cuesta mucho esto. Un par de dudas:
- ¿Debo introducir las primeras líneas dos veces, no? ¿Una por cada archivo de partida?
- ¿No es necesario introducir el número de líneas de los archivos verdad? Porque estoy trabajando con archivos muy grandes.
- ¿Puedo colocar los tres pasos seguidos en un solo archivo?

¡De nuevo, muchísimas gracias!
MGRnovel
Perlero nuevo
Perlero nuevo
 
Mensajes: 9
Registrado: 2010-04-06 05:31 @271

Re: Leer archivo de Excel e importar columnas a nuevo archivo

Notapor panterozo » 2010-04-06 10:35 @483

MGRnovel escribiste:- ¿Debo introducir las primeras líneas dos veces, no? ¿Una por cada archivo de partida?


Así es, pero ten claro de que debes guardar la información que primero saques, para luego guardar las nuevas celdas en un nuevo Archivo.xls.

MGRnovel escribiste:- ¿No es necesario introducir el número de líneas de los archivos verdad? Porque estoy trabajando con archivos muy grandes.


No es necesario, ya que en las líneas 15 y 16 del código anterior, se captura el máximo y mínimo de celdas del archivo y en las líneas 18 y 19 se recorre con los valores antes capturados.

- En esta parte, me fijé que recorre en todas las pestañas que tengas abiertas (línea 13), entonces, si tienes por ejemplo un archivo Excel con 5 pestañas, recorrerá las 5 pestañas, y quizás tu no quieras eso, quizás solo quieres recorrer una pestaña. Si es así, te recomiendo eliminar las pestañas que no te sirven o bien darle una variable de control para la pestaña que realmente desees leer.

MGRnovel escribiste:- ¿Puedo colocar los tres pasos seguidos en un solo archivo?


Claro ;)
panterozo
Perlero nuevo
Perlero nuevo
 
Mensajes: 160
Registrado: 2010-01-26 08:36 @400

Re: Leer archivo de Excel e importar columnas a nuevo archivo

Notapor MGRnovel » 2010-04-06 10:53 @495

En la parte en la que creo los nuevos archivos:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
my $sp=Spreadsheet::Write->new(
    file        => 'm1.xls',
    styles      => {
        header  => { font_weight => 'bold' },
    },
);

sp->addrow(
    { content => 'Modulo', font_weight => 'bold' },
    { content => 'Direccion', font_weight => 'bold' }
);

$sp->addrow('columna0','columna1');
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Dudas:
- ¿'bold', a qué se refiere?
- ¿Puedo hacer de forma automática que se creen 'n' archivos? ¿Desde 1 a 'n', las columnas que tienen los dos archivos originales que tengo, o tengo que repetir estas líneas tantas veces como archivos quiero tener?

¡Muchísimas gracias, de verdad!
MGRnovel
Perlero nuevo
Perlero nuevo
 
Mensajes: 9
Registrado: 2010-04-06 05:31 @271

Re: Leer archivo de Excel e importar columnas a nuevo archivo

Notapor panterozo » 2010-04-06 12:34 @565

MGRnovel escribiste:En la parte en la que creo los nuevos archivos:

- ¿'bold', a qué se refiere?


En la documentación del módulo aparece lo siguiente:

font_weight weight of font. Only valid value is 'bold'

Si quisieras saber más allá de lo que aquí se explica, lo que yo hago es entrar a ver directamente el código. Yo paso por alto muchas de estas cosas :P

MGRnovel escribiste:- ¿Puedo hacer de forma automática que se creen 'n' archivos? ¿Desde 1 a 'n', las columnas que tienen los dos archivos originales que tengo, o tengo que repetir estas líneas tantas veces como archivos quiero tener?


Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
my @sp; # Yo creo que bastaría con crear un arreglo, y luego, para grabar los datos, lo mismo
for(my $i=0;$i<n;$i++){#El 'n' es el total de archivos a crear CON DOS COLUMNAS
    my $file = "m".$i."xls";
    my $sp[$i] = Spreadsheet::Write->new(
        file        => $file, #m0.xls, m1.xls, m2.xls..., mn.xls
        styles      => {
            header  => { font_weight => 'bold' },
        },
    );

    sp[$i]->addrow(
        { content => 'Modulo', font_weight => 'bold' },
        { content => 'Direccion', font_weight => 'bold' }
    );
}
 
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


y luego para llenar cada uno de estos archivos

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
$sp[0]->addrow('columna0','columna1');
$sp[1]->addrow('columna0','columna1');
$sp[2]->addrow('columna0','columna1');
$sp[3]->addrow('columna0','columna1');
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


de todas maneras, esto se puede hacer de muchas otras formas. Espero te sirva de ayuda
saludos
Última edición por explorer el 2010-04-06 14:36 @650, editado 1 vez en total
Razón: Formateo, bloques de código
panterozo
Perlero nuevo
Perlero nuevo
 
Mensajes: 160
Registrado: 2010-01-26 08:36 @400

Re: Leer archivo de Excel e importar columnas a nuevo archivo

Notapor MGRnovel » 2010-04-07 04:29 @228

¿Y si escribo como sigue me irá rellenando los archivos que se van creando?

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
my @sp; #crear un arreglo
for(my $i=0;$i<n;$i++){#El 'n' es el total de archivos a crear CON DOS COLUMNAS
    my $file = "m".$i."xls";
    my $sp[$i] = Spreadsheet::Write->new(
        file        => $file, #m0.xls, m1.xls, m2.xls..., mn.xls
        styles      => {
            header  => { font_weight => 'bold' },
        },
    );

    sp[$i]->addrow(
        { content => 'Modulo', font_weight => 'bold' },
        { content => 'Direccion', font_weight => 'bold' }
    );
    sp[$i]->addrow('columna0','columna1');
}
 
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Otra cosiña, me sale el siguiente error, ¿a qué puede ser debido?
Captura.PNG
Captura.PNG (4.98 KiB) Visto 1340 veces
Última edición por explorer el 2010-04-07 04:37 @234, editado 1 vez en total
Razón: Ortografía
MGRnovel
Perlero nuevo
Perlero nuevo
 
Mensajes: 9
Registrado: 2010-04-06 05:31 @271

Re: Leer archivo de Excel e importar columnas a nuevo archivo

Notapor explorer » 2010-04-07 04:53 @245

No es necesario que mandes una captura en imagen del mensaje de error. Te vale con copiar y pegar el texto del error. Lo seleccionas en pantalla y lo pegas en tu mensaje.

El mensaje dice que estás usando la variable $i fuera del contexto en donde la declaraste. O que estás usando una variable $i en un contexto donde no la has declarado.
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: Leer archivo de Excel e importar columnas a nuevo archivo

Notapor MGRnovel » 2010-04-07 05:10 @257

Lo que pasa es que no me deja seleccionar en la ventana, por eso hice una captura.

En lo que respecta al error, ¿no estoy declarando la variable en la segunda línea, con my $i=0;$i<n;$i++?

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
my @sp; #crear un arreglo
for(my $i=0;$i<n;$i++){#El 'n' es el total de archivos a crear CON DOS COLUMNAS
    my $file = "m".$i."xls";
    my $sp[$i] = Spreadsheet::Write->new(
        file        => $file, #m0.xls, m1.xls, m2.xls..., mn.xls
        styles      => {
            header  => { font_weight => 'bold' },
    },
    );    
    sp[$i]->addrow(
        { content => 'Modulo', font_weight => 'bold' },
        { content => 'Direccion', font_weight => 'bold' }
    );
    sp[$i]->addrow('columna0','columna1');
}
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Muchas gracias.
MGRnovel
Perlero nuevo
Perlero nuevo
 
Mensajes: 9
Registrado: 2010-04-06 05:31 @271

Operar columnas de datos

Notapor MGRnovel » 2010-04-07 06:11 @299

Hola,

Me gustaría saber si puedo hacer con Perl un script que lea un archivo Excel con dos columnas, opere estas dos columnas entre sí empleando diferentes fórmulas y devuelva un archivo con las dos columnas iniciales y las nuevas columnas de datos calculadas. Para leer el archivo uso el Spreadsheet::ParseExcel, ¿no?, pero para operar los datos de las columna ¿qué uso? El ¿Math::MatrixReal?

Muchas gracias por vuestra ayuda.
Última edición por explorer el 2010-04-07 06:22 @307, editado 1 vez en total
Razón: PERL => Perl
MGRnovel
Perlero nuevo
Perlero nuevo
 
Mensajes: 9
Registrado: 2010-04-06 05:31 @271

Siguiente

Volver a Básico

¿Quién está conectado?

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