Foros del Web » Programación para mayores de 30 ;) » Programación General »

¿Cómo puedo borrar un dato de un archivo?

Estas en el tema de ¿Cómo puedo borrar un dato de un archivo? en el foro de Programación General en Foros del Web. Hola a tod@s! Tengo el siguiente problema: En un replicador de páginas al borrar un afiliado se borran todos los datos del mismo menos el ...
  #1 (permalink)  
Antiguo 21/08/2004, 12:49
 
Fecha de Ingreso: noviembre-2003
Ubicación: Zaragoza, España
Mensajes: 1.257
Antigüedad: 20 años, 5 meses
Puntos: 154
¿Cómo puedo borrar un dato de un archivo?

Hola a tod@s!

Tengo el siguiente problema:

En un replicador de páginas al borrar un afiliado se borran todos los datos del mismo menos el nombre de usuario en el archivo del downline del Sponsor, el código que hay para borrar los datos es este:

Código:
&deletefile("$datadir/cgi/$first/$user.cgi");
&deletefile("$datadir/downline/$first/$user.downline");
&deletefile("$datadir/hit/$first/$user.hit");
La cuestión es que según esto borra los archivos completos (como debe ser) pero para borrar el usuario del archivo del downline del Sponsor no tiene nada y hay que borrarlo a mano, lo que quiero hacer yo es añadirle lo necesario para que haga también esto, pero no se cómo. El archivo del downline es de tipo texto con extensión .downline y con el formato:

Código:
usuario1
usuario2
usuario3
Lo que hay que hacer es que al borrar un afiliado (o varios) borre también el usuario que corresponda en el .downline

Espero que alguien me pueda echar un cable

Muchas gracias por anticipado
  #2 (permalink)  
Antiguo 23/08/2004, 05:42
Avatar de monoswim
$moderador{'Esteban'}
 
Fecha de Ingreso: febrero-2002
Ubicación: Buenos Aires - Argentina
Mensajes: 8.762
Antigüedad: 22 años, 3 meses
Puntos: 90
Te paso esta función que escribí yo mismo...

Código:
sub delete {
        my @new_registros;
        open (DATABASE, "<$_[0]") || &error('abrir','archivo');
        my @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');
        foreach $new_registro (@new_registros){
                print DATABASE "$new_registro\n";
        }
        close (DATABASE) || &error('cerrar','archivo');

}
Hola, yo escribí algunos tutoriales sobre como usar bases de datos tipo texto y los uedes encontrar en www.perlenespanol.com

En esta función la tienes que llamar pasándole 2 parámetros, uno el nombre del archivo, y otro el número id del registro a eliminar...

la idea es que el archivo esté así:

1||usuario1
2||usuario2
3||usuario3

Para usarlo sin los id me imagino que le debes hacer algo así...

Código:
        foreach $registro (@registros){
                $registro =~ s/\n//g;
                if ($registro ne $_[1]){
                        push (@new_registros,$registro);
                }
        }
Esto va en vez de lo otro, fíjate de cambiarlo y ahora pasarle en vez del id, el nombre del usuario.

Saludos
__________________
Esteban Quintana
  #3 (permalink)  
Antiguo 07/09/2004, 16:48
 
Fecha de Ingreso: noviembre-2003
Ubicación: Zaragoza, España
Mensajes: 1.257
Antigüedad: 20 años, 5 meses
Puntos: 154
Hola Monoswim!!

Muchas gracias!!

Si me lo permites ¿podría abusar un poco de tu experiencia?

Es que resulta que de perl tengo nada de idea, por eso te pido si me lo puedes adaptar y/o explicar un poco más "para tontos", porque así según lo pones parece sencillo pero cuando me pongo a probarlo no se por donde empezar , por eso puse todo el trozo de código a ver si hay algo sencillo que se pueda hacer para modificarlo y que borre sólo los usuarios que deben ser borrados del archivo .downline en cada caso.

Lo que debe borrar no es de la base de datos sino del archivo donde figuran todos los usuarios del sponsor, sin id's ni nada.

Tal como yo lo entiendo (que no entiendo mucho), se me queda así:

Código:
sub delete {
        my @new_registros;
        open ($datadir/downline/$first/$sponsor.downline, "<$_[0]") || &error('abrir','archivo');
        my @registros = <$datadir/downline/$first/$sponsor.downline>;
        close ($datadir/downline/$first/$sponsor.downline) || &error('cerrar','archivo');

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

        open ($datadir/downline/$first/$sponsor.downline, ">$_[0]") || &error('abrir','archivo');
        foreach $new_registro (@new_registros){
                print $datadir/downline/$first/$sponsor.downline "$new_registro\n";
        }
        close ($datadir/downline/$first/$sponsor.downline) || &error('cerrar','archivo');

}
creo que lo que debo borar del achivo $sponsor.downline es $user, pero no se dónde encaja esto en este código.

Ya te digo que no tengo ni idea de perl, por eso te pido si puedes ayudarme con muuuucha paciencia

Muchas gracias de antemano
  #4 (permalink)  
Antiguo 08/09/2004, 05:14
Avatar de monoswim
$moderador{'Esteban'}
 
Fecha de Ingreso: febrero-2002
Ubicación: Buenos Aires - Argentina
Mensajes: 8.762
Antigüedad: 22 años, 3 meses
Puntos: 90
a ver si te entiendo: tienes un archivo com ser usuarios.downline en donde tienes todos los usuarios de la forma

usuario1
usuario2
usuario2

y quieres eliminar uno de esos usuarios.

para eso tienes que abrir el archivo usuarios.downtime y colocar su contenido en un @array, ahora bien, hacemos un bucle (foreach) que verifique cada uno de los elementos del array comparándolo con el usuario que quieres eliminar: Si es distinto, colocamos ese usuario en un nuevo array que tendrá los usuarios que quedan, si es igual que lo deje en el array viejo...Y lógicamente, para tenminar abrimos el archivo y guardamos el nuevo array con los usuarios que quedan.

Código:
sub delete {
        my @new_registros;
        open (MONOSWIM, "<$datadir/downline/$first/$sponsor.downline") || &error('abrir','archivo');
        my @registros = <MONOSWIM>;
        close (MONOSWIM) || &error('cerrar','archivo');

foreach my $registro (@registros){
                $registro =~ s/\n//g;
                if ($registro ne $usuario_a_eliminar){
                        push (@new_registros,$registro);
                }
        }

        open (MONOSWIM, ">$datadir/downline/$first/$sponsor.downline") || &error('abrir','archivo');
        foreach my $new_registro (@new_registros){
                print MONOSWIM "$new_registro\n";
        }
        close (MONOSWIM) || &error('cerrar','archivo');

}
Como verás en la función open la primera palabra es solo el nombre del manejador de archivo, ahí puedes poner lo que quieras, MONOSWIM, DATABASE, CACA O CUALQUIER PALABRA y luego de la coma (,) va la dirección del archivo antecedida por la manera en la cual vas a abrir el archivo

< Solo lectura
> Lo puedes escribir desde el principio (borra todo)
>> Deja todo como está y se posiciona al final del archivo

Bueno, decime cualquier cosa que no entiendas

Saludos
__________________
Esteban Quintana

Última edición por monoswim; 08/09/2004 a las 05:15
  #5 (permalink)  
Antiguo 29/09/2004, 00:45
 
Fecha de Ingreso: noviembre-2003
Ubicación: Zaragoza, España
Mensajes: 1.257
Antigüedad: 20 años, 5 meses
Puntos: 154
Hola Monoswim!!

Mucho tiempo si poder venir por aquí...

Muchas gracias por tu ayuda, he intentado implementar el script con lo que tú me decías pero sigue igual, no funciona.

Te pongo aquí un trozo del código en el que están incluidas las modificaciones que me explicabas:

Código:
sub database_delete2 {
	my ($user_list, @username);
	
	## Get needed info
	@username = split /,/, $in{'username'};
	
	## Delete all members
	foreach $user (@username) {
		my ($first, $ext);
		
		## Get needed info
		($first) = $user =~ /^(.)/; $first = lc($first);
		$ext = &get_ext($user);
		
		## Send e-mail, if needed
		if ($in{'_send_email'} == 1) { 
			my ($x, @profile, %mail);
			
			## Get and parse profile
			$x=0;
			@profile = &get_userinfo($user);
			$profile[$dbfields[2]] = $ENC->decrypt($profile[$dbfields[2]]);
			foreach $field (@userfields) { $mail{$field} = $profile[$x]; $x++; }
			
			## Send e-mail message
			&mailmsg_from_file($profile[$dbfields[1]], "$datadir/messages/database_delete.msg", $admin_email, $admin_name, '', %mail);
			
		}

		## Execute remote script
		&mrep_execute_remote_script($user, 'delete');

		## Compress downline, if needed
		&mrep_compress_downline($user);

		## Delete member from db index
		&mrep_dbindex_delete($user);
		
		## Delete the member
		&deletefile("$datadir/cgi/$first/$user$ext");
		&deletefile("$datadir/downline/$first/$user.downline");
		&deletefile("$datadir/hit/$first/$user.hit");
		
		sub delete {
	        my @new_registros;
	        open (DATABASE, "<$datadir/downline/$first/$sponsor.downline") || &error('abrir','archivo');
 		       my @registros = <DATABASE>;
		        close (DATABASE) || &error('cerrar','archivo');

		foreach my $registro (@registros){
                	$registro =~ s/\n//g;
                	if ($registro ne $user){
                        push (@new_registros,$registro);
                		}
        		}

        	open (DATABASE, ">$datadir/downline/$first/$sponsor.downline") || &error('abrir','archivo');
        	foreach my $new_registro (@new_registros){
                print DATABASE "$new_registro\n";
        	}
        	close (DATABASE) || &error('cerrar','archivo');

		}

		## Delete from member.pass, if needed
		if ($moptions[1] == 1) { 
			my ($x, @pass);
			
			## Get info
			@pass = &readfile("$datadir/member.pass");
			
			## Delete member's entry
			$x=0;
			foreach $line (@pass) {
				my ($username, $password) = split /:/, $line;
				if ($username eq $user) { 
					splice @pass, $x, 1;
					last;
				}
			$x++; }
			
			## Rewrite member.pass file
			&writefile("$datadir/member.pass", @pass);		
		}
		
		## Add to user list
		$user_list .= "<li>$user";

	}
	
	## Print success message
	&success("Los siguientes miembros han sido borrados correctamente:<br><ul>$user_list</ul>");

}
Lo que está en negrita dentro del código es la modificación que me proponías (cambiando el $usuario_a_eliminar por $user, que es el que usa el script.

Espero que me puedas echar un cable...
  #6 (permalink)  
Antiguo 29/09/2004, 05:59
Avatar de monoswim
$moderador{'Esteban'}
 
Fecha de Ingreso: febrero-2002
Ubicación: Buenos Aires - Argentina
Mensajes: 8.762
Antigüedad: 22 años, 3 meses
Puntos: 90
Hola, te cuento que estube viendo el script y encuentro nada raro, le checkie la sintaxis y tampoco me dió nada raro...Así que tienes que empezar a acotar los errores...Lo cual significa hacer una serie de pruebas para encontrar el maldito error.

Una prueba puede ser hacer una impresión de todas las variables que supuestamente tienen que tener una información específica, para checkear que esa sea la información que tienen.

Por ejemplo:
open(DATABASE,"<archivo.txt");
my @lineas = DATABASE;
print @lineas;
close(DATABASE);

Así con cada una de las variables críticas, que son aquellas que tienen la información que te interesa, por ejemplo antes de guardar de nuevo los usuarios en el archivo cuando eliminas a uno.

Otra forma interesante es colocar el "o" lógico por si la instrucción no se ejecuta de manera que se ejecute o que nos de un mensaje de error

open(database,"<archivo.txt") || &error('abrir','database');

de esa manera o abre el archivo o ejecuta la subritina &error con esos parámetros

sub error {
print "content-type:text/html \n\n";
print "cant $_[0] the $_[1]";
exit;
}

Bueno, espero que te sirva
Saludos
__________________
Esteban Quintana
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 10:33.