Jue Mar 16, 2006 11:41 am
|
 |
malgo
Perlero Nuevo

|
Registrado: 16 Mar 2006
Mensajes: 4
|
|
| Como puedo saber que contiene la fila antes del write |
|
|
| 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 |
|
|
|
Jue Mar 16, 2006 2:09 pm
|
 |
explorer
Moderador

|
Registrado: 24 Jul 2005
Mensajes: 4082
Ubicación: Valladolid, España
|
|
|
|
|
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; |
|
|

Jue Mar 16, 2006 4:01 pm
|
 |
malgo
Perlero Nuevo

|
Registrado: 16 Mar 2006
Mensajes: 4
|
|
|
|
|
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 |
|

Vie Mar 17, 2006 6:40 am
|
 |
explorer
Moderador

|
Registrado: 24 Jul 2005
Mensajes: 4082
Ubicación: Valladolid, España
|
|
|
|
|
| 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? |
|

Vie Mar 17, 2006 7:49 am
|
 |
malgo
Perlero Nuevo

|
Registrado: 16 Mar 2006
Mensajes: 4
|
|
|
|
|
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 |
|

Sab Mar 18, 2006 5:54 am
|
 |
explorer
Moderador

|
Registrado: 24 Jul 2005
Mensajes: 4082
Ubicación: Valladolid, España
|
|
|
|
|
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. |
|

Lun Mar 20, 2006 4:45 pm
|
 |
malgo
Perlero Nuevo

|
Registrado: 16 Mar 2006
Mensajes: 4
|
|
|
|
|
| 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... |
|

Lun Mar 20, 2006 4:58 pm
|
 |
kidd
Creador de Perl en Español

|
Registrado: 15 Oct 2003
Mensajes: 1389
Ubicación: México
|
|
|
|
|
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 |
|
Powered by phpBB © 2001, 2005 phpBB Group
|