¡Ya estamos en Twitter!

Perl en Español

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

Base de Datos TXT : Parte II

por monoswim

Introducción

Hola a todos!, acá les escribo la segunda parte del tutorial sobre bases de datos tipo TXT (como el DBF), en donde mediante algunas simples funciones podemos administrar los registros y las tablas de la base de datos, sin tener la necesidad de usar grandes motores de bases de datos, ya que solo necesitamos el interprete de perl para utilizarlo.

NOTA: Recuerda que para comprender totalmente este tutorial, debes de leer la Primera Parte.

Más Funciones...

Para este tutorial les escribí 3 funciones más...que junto con las anteriores ya nos dan una buena base como para administrar nuestra base de datos sin problemas.

Estas funciones son:

  • delete: elimina un elemento buscando un valor numérico del campo id
  • selects_by_2_numbers: Selecciona todos los registros de la tabla que coincidan con dos patrones numéricos, por ejemplo, que el campo edad sea = a 23 y que el campo altura sea = a 180.
  • delete_by_string: Elimina un retistro de la tabla buscando un valor alfabético.

Muy bien, demos un vistazo a las nuevas funciones.

Delete

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){
$registro =~ s/\n//g;
my($id,@basura) = split(/\|\|/, $registro);
if ($id != $_[1]){
push (@new_registros,$registro);
}
}

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');
}

Para usar esta funcion le debemos pasar por parámetro 2 valores:
Primero el nombre de la tabla y Segundo el número del campo ID que queremos eliminar. Por ejemplo:

&delete('usuarios.txt',5);
#elimina al usuario cuyo id es 5

Selects by 2 numbers

sub selects_by_2numbers {

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);
}

Esta función es como el select normal solo que tiene dos complicaciones más, la primera es que al sacar el LAST, el bucle foreach seguirá dando verificando todos los registros en busca de coincidencias en el if, así en ves de retornarnos solo un registro nos retorna todos los registros que cumplan con esa condición. La segunda complicación es que en el if colocamos 2 condiciones para que verifique...también se pueden poner más y tanto con == para números como en eq para letras.

Para llamar a esta función lo debemos hacer pasándole 5 parámetros:

  • 1 el nombre del archivo
  • 2 el número de comumna en donde se encuentra el primer dato a comparar
  • 3 el valor que ese dato que queremos comparar para seleccionar el registro
  • 4 el número de comumna en donde se encuentra el segundo dato a comparar
  • 5 el valor que ese dato que se va a comparar (segundo caso)

Por ejemplo:

my @recordset = &selects_by_2_numbers('usuarios.txt',2,3,5,7);

Esta función nos retornará un array con todos los registros seleccionados, pero cada registro (elemento del array) tiene todas las columnas unidas por || de forma que un posible resultado puede ser:

5||monoswim||3||password||esteban||7||masdata...
9||kidd||3||password||uriel||7||masdata...

Vemos como las posiciones 2 y 5 tienen los valores 3 y 7 respectivamente como habíamos puesto en el select (cabe destacar que empieza a contar desde 0 y no desde 1).

Delete by String

sub delete_by_string {

my (@registros,@new_registros,@data);

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

foreach $registro (@registros){
$registro =~ s/\n//g;
(@data) = split(/\|\|/, $registro);
if ($data[$_[1]] ne $_[2]){
push (@new_registros,$registro);
}
}

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');
}

Una función muy parecida a delete, con la única salvedad de que esta lo hace mendiante eq en vez de == con lo cual verifica que la igualdad se de alfabéticamente y no numéricamente.

NOTAS FINALES

Con estos dos tutoriales ya contamos con una base más que suficiente para utilizar este tipo de bases de datos, no creo que haya mayores complicaciones...ya que a lo largo de los mismos vimos todos (o casi todos) los puntos importantes a tener en cuenta.

PD: Ante cualquier crítica, consulta o pregunta les dejo mi mail: [email protected].

¿Quiéres más tutoriales como este? Escribir tutoriales toma una gran cantidad de tiempo y esfuerzo. Si este tutorial te ayudó a aprender o a solucionar algo, por favor considera dejar alguna donación en apoyo a Perl en Español.

Cliquea en el botón de abajo para dejar tu donación por medio de PayPal.

Comparte:
Categorías de Tutoriales:
En Nuestros Foros:

    Software error:

    junk after document element at line 1, column 32, byte 32 at /usr/lib64/perl5/vendor_perl/XML/Parser.pm line 187.
    

    For help, please send mail to the webmaster ([email protected]), giving this error message and the time and date of the error.

  • Entra a los foros »
Socializa:
Síguenos por Twitter

Suscríbete GRATUITAMENTE al Boletín de Perl en Español

Perl en Español es mantenido con Movable Type
Todo el contenido de Perl en Español está bajo una licencia CC:
Creative Commons License