• Publicidad

Manejo de archivos texto. Borrado y búsqueda

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

Manejo de archivos texto. Borrado y búsqueda

Notapor Hector Gutierrez » 2011-05-02 13:02 @585

Hola, he estado probando las rutinas del tutorial de base de datos para manejo de texto y tengo las siguientes preguntas:

1. Se creó una librería llamada txtdb_lib.pl, la llamé de un programa con use txtdb_lib.pl, y me marcó error. Lo que hice fue incluir todo el código en mi programa principal, pero ¿cómo la llamo?

2. Para probar todas las rutinas generé el archivo base_datos.txt con el siguiente contenido:

id||nombre||no1||apellido||no5||email
1||esteban||1||quintana||2||[email protected]
2||uriel||3||lizama||4||[email protected]
3||hector||5||gutierrez||6||[email protected]
4||reynaldo||7||gutierrez||8||[email protected]
5||marco||9||zenil||10||[email protected]
6||miriam||11||sanchez||12||[email protected]
7||lula||3||gutierrez||4||[email protected]

3. Ejecuté el programa Borra registro txt.pl que tiene el siguiente código:

#!/usr/bin/perl

#------------ Prueba del manejo de archivos TXT BORRADO

#------------ &delete('base_datos.txt',5);

#------------ my @recordset = &selects_by_2_numbers('base_datos.txt',2,3,4,4);
my @data = ('ramon||6||hernandez||7||[email protected]');
&insert( 'base_datos.txt', @data );

#----- while(@recordset){
#----- print "$recordset[0] $recordset[1] $recordset[2] $recordset[3] $recordset[4] $recordset[5]\n";
#----- }

#------------ Rutina que borra registros por su ID
#------------ lOS PARAMETROS SON 2 EL ARCIVO.TXT Y EL NÚMERO A BORRAR

sub delete {
my ( @registros, @new_registros );

open( DATABASE, "<$_[0]" ) || &error( 'abrir', 'archivo' );
flock( DATABASE, 1 ) || &error( 'lock', 'file' );
@registros = <DATABASE>;
close(DATABASE) || &error( 'cerrar', 'archivo' );

foreach $registro (@registros) {

#----- print "$registros\n";
$registro =~ s/\n//g;
my ( $id, @basura ) = split( /\|\|/, $registro );
if ( $id != $_[1] ) {
push( @new_registros, $registro );

#--------- print "$registros\n";
}
}

open( DATABASE, ">$_[0]" ) || &error( 'abrir', 'archivo' );
flock( DATABASE, 2 ) || &error( 'lock', 'file' );
foreach $new_registro (@new_registros) {
print DATABASE "$new_registro\n";
}
close(DATABASE) || &error( 'cerrar', 'archivo' );
}

#-------------- Esta rutina abre la base de datos

sub open_db {
my (@registros);
open( DATABASE, "<$_[0]" ) || &error( 'abrir', 'archivo' );
flock( DATABASE, 1 ) || &error( 'lock', 'file' );
@registros = <DATABASE>;
print "$registros\n";
close(DATABASE) || &error( 'cerrar', 'archivo' );
shift(@registros);
print "$registros\n";
return (@registros);
}

#-------------------- esta rutina selecciona por su número de registro

sub select_by_number {
my ($i, @registros, $registro,
@recordset, %return_recordset, $registro_cero,
@nombres, $cant_reg, $cant_reg_cero
);
open( DATABASE, "<$_[0]" ) || &error( 'abrir', 'archivo' );
flock( DATABASE, 1 ) || &error( 'lock', 'file' );
@registros = <DATABASE>;
close(DATABASE) || &error( 'cerrar', 'archivo' );
$registro_cero = shift(@registros);

#----------- print "$registro_cero\n";
$registro_cero =~ s/\n//g;

#----------- print "$registro_cero\n";
@nombres = split( /\|\|/, $registro_cero );
$cant_reg_cero = @nombres;

#----------- print "$cant_reg_cero\n";
foreach $registro (@registros) {
$registro =~ s/\n//g;
@recordset = split( /\|\|/, $registro );
if ( $recordset[ $_[1] ] == $_[2] ) {
$cant_reg = @recordset;
if ( $cant_reg != $cant_reg_cero ) {
&error( 'procces',
'database- no coinciden las cantidades de registros' );
}
while ( $i < $cant_reg ) {
$return_recordset{ $nombres[$i] } = $recordset[$i];
$i++;
}
last;
}
}
return (%return_recordset);
}

#----------------------- Inserta registros

sub insert {
my ( $urldb, @data, @registros, $ultimo_registro, $id, @basura,
$new_registro );
( $urldb, @data ) = @_;

open( DATABASE, "<$urldb" ) || &error( 'abrir', 'archivo' );
flock( DATABASE, 1 ) || &error( 'lock', 'file' );
@registros = <DATABASE>;
close(DATABASE) || &error( 'cerrar', 'archivo' );
$ultimo_registro = @registros;
$ultimo_registro = $ultimo_registro - 1;
( $id, @basura ) = split( /\|\|/, $registros[$ultimo_registro] );
$id++;
$new_registro = $id;

foreach $data (@data) {
$data =~ s/\n//g;
$new_registro .= "||$data";
}

open( DATABASE, ">>$_[0]" ) || &error( 'abrir', 'archivo' );
flock( DATABASE, 2 ) || &error( 'lock', 'file' );
print DATABASE "$new_registro\n";
close(DATABASE) || &error( 'cerrar', 'archivo' );
}

#------------ Rutina que selecciona registros por 2 criterios

sub selects_by_2_numbers {
my ( @registros, $registro, @recordset, @return_recordset );

open( DATABASE, "<$_[0]" ) || &error( 'abrir', 'archivo' );
flock( DATABASE, 1 ) || &error( 'lock', 'file' );
@registros = <DATABASE>;
close(DATABASE) || &error( 'cerrar', 'archivo' );
shift(@registros);

foreach $registro (@registros) {
@recordset = split( /\|\|/, $registro );
if ( $recordset[ $_[1] ] == $_[2] and $recordset[ $_[3] ] == $_[4] ) {
push( @return_recordset, $registro );
}
}

return (@return_recordset);
}



Le doy de argumento &delete('base_datos.txt',5);

Lo ejecuta y, en efecto, borra, pero me despliega el mensaje
Argument “id” isn´t numeric in numeric ne (!=) at line 27 que contiene: if ($id != $_[1]){ ¿porqué?.

Adicionalmente, en el foreach() se hace mención a $registro y en ninguna parte se declaró, o ¿cómo funciona?

Ejecuté la rutina de:

my @recordset = &selects_by_2_numbers('base_datos.txt',2,3,4,4);

usando el mismo archivo. ¿Cómo sé cuántos registros cumplen la condición y cómo los puedo presentar en pantalla? Lo que hice fue:

while(@recordset){
print "$recordset[0] $recordset[1] $recordset[2] $recordset[3] $recordset[4] $recordset[5]\n";
}

Y no funcionó, ¿Cómo lo hago?

Finalmente la rutina de insert trabajó muy bien.

Notas: En el programa están comentadas las líneas del delete y del
my @recordset = &selects_by_2_numbers('base_datos.txt',2,3,4,4);
Hector Gutierrez
Perlero nuevo
Perlero nuevo
 
Mensajes: 37
Registrado: 2011-04-15 14:49 @659

Publicidad

Re: Manejo de archivos texto. Borrado y búsqueda

Notapor explorer » 2011-05-02 13:45 @614

1.- Puedes convertirlo a un módulo o con do() (consulta perldoc -f do)

2.- El error Argument “id” ... se refiere a la primera línea del fichero de texto, indicando que estás intentando hacer una comparación numérica, pero la palabra 'id' no lo es.

$registro sí se ha declarado. Veo instrucciones my() antes del foreach().

Para contar registros que cumplen con la condición, te vale con usar contadores, que mostrarás al final de los bucles.
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: Manejo de archivos texto. Borrado y búsqueda

Notapor Hector Gutierrez » 2011-05-02 19:02 @835

Ya funciona correctamente, realicé lo siguiente.

1. Use do 'libreria.pl';
2. Eliminé el primer registro del archivo txt que eran los títulos de las columnas, y
3. Coloqué un contador y correcto.

Cierro esta solicitud. Gracias.
Hector Gutierrez
Perlero nuevo
Perlero nuevo
 
Mensajes: 37
Registrado: 2011-04-15 14:49 @659


Volver a Básico

¿Quién está conectado?

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