Com Eliminar Una Línia D’un Fitxer

Taula de continguts:

Com Eliminar Una Línia D’un Fitxer
Com Eliminar Una Línia D’un Fitxer

Vídeo: Com Eliminar Una Línia D’un Fitxer

Vídeo: Com Eliminar Una Línia D’un Fitxer
Vídeo: Como Borrar las lineas de la Cero, de un Fade, Desvanecido ★ Como hacer un Fade | Técnicas 2024, Maig
Anonim

Quan es treballa amb petites quantitats de dades en PHP, de vegades és més fàcil emmagatzemar-los en fitxers que crear una base de dades i organitzar la interacció dels scripts amb ella. En aquests casos, la tasca de suprimir línies especificades d'un fitxer de text no és infreqüent. Vegem de prop la manera més senzilla possible de fer-ho.

PHP: com eliminar una línia d'un fitxer
PHP: com eliminar una línia d'un fitxer

Necessari

Coneixements bàsics de PHP

Instruccions

Pas 1

Dades inicials:

- tenim un fitxer de text allStrings.txt, que conté diverses línies de dades

- cal esborrar la línia núm. 44 del fitxer

L’algoritme per resoldre el problema serà el següent: cal obrir el fitxer, llegir les línies que conté en una matriu de cadenes i sobreescriure el fitxer existent amb el contingut de la matriu, saltant-se la línia que es vol eliminar.

Pas 2

Per implementar aquest algorisme a l'script, primer assignem valors a variables que contindran el nom del fitxer origen i el número de la línia a suprimir: $ fileName = "allStrings.txt";

$ lineToKill = 44; A continuació, llegim el fitxer en una matriu de cadenes: $ stringsArray = file ($ fileName); Comprovem si el fitxer conté la línia que necessitem. Tots els codis addicionals només s'executaran si la condició $ lineToKill no és superior al nombre de línies de la matriu $ stringsArray: if ($ lineToKill <= count ($ stringsArray)) {

// aquest serà el bucle principal del programa

} Si la condició no es compleix, no tenim res a suprimir. Deixeu que l'script imprimeixi un missatge informatiu sobre això: en cas contrari, feu clic a "El nombre de línies del fitxer és inferior a". $ LineToKill. "!"; Si es compleix la condició, heu d'esborrar el fitxer d'origen d'una nova entrada: $ fileHandle = fopen ($ fileName, "w"); Ara hauríem d'organitzar un bucle que repeteixi tots els elements de la matriu de cadenes. Però com que la indexació de matriu comença des de zero i comptem el número de línia per a la supressió d'un, fins i tot abans de l'inici del bucle disminuirem el valor de $ lineToKill en un, per no repetir aquesta operació a cada pas: $ lineToKill -; Per organitzar un bucle: foreach ($ stringsArray com a $ clau => $ valor) {

// aquí teniu el codi de cada pas del bucle

} La variable $ key contindrà l'índex de la línia actual a la matriu i la variable $ value contindrà el valor d'aquesta línia. A cada pas del bucle, compararem l’índex de la línia de la matriu amb el número que s’ha de suprimir i, si no coincideixen, escriurem el valor d’aquesta línia al fitxer: if ($ key! = $ LineToKill) fwrite ($ fileHandle, $ value); si coincideixen, no escriurem al fitxer, sinó que imprimirem un missatge sobre la supressió correcta: en cas contrari, feu ressò de "Line". $ LineToKill. al final del cicle, quan s'acabi l'escriptura al fitxer, hauríeu de tancar-lo educadament: fclose ($ fileHandle);

Pas 3

El codi complet serà així: <? Php $ fileName = "allStrings.txt";

$ lineToKill = 44; $ stringsArray = fitxer ($ fileName);

if ($ lineToKill <= count ($ stringsArray)) {

$ fileHandle = fopen ($ fileName, "w");

$ lineToKill--;

foreach ($ stringsArray com a $ clau => $ valor) {

if ($ key! = $ lineToKill) fwrite ($ fileHandle, $ value);

else fa ressò de "Línia". $ lineToKill. "suprimit.";

}

fclose ($ fileHandle);

}?> Per descomptat, aquest és el codi més senzill, en el qual no hi ha protecció contra totes les complicacions que es puguin produir durant el treball del guió en condicions reals. Per exemple, si un fitxer conté un gran nombre de línies, la seva lectura en una matriu mossegarà un tros que no és admissible per a un script dels recursos del servidor. Per descomptat, el treball amb grans quantitats de dades s’hauria d’organitzar a través de bases de dades, no de fitxers de text. Però, tot i així, com a exemple educatiu, donarem un codi que també resol aquest problema. Aquí l'algorisme serà diferent de l'anterior: per no emmagatzemar un gran nombre de línies a la matriu, l'script llegirà del fitxer font una línia a la vegada i les escriurà una a una al fitxer temporal. Al final d'aquest procés, se suprimirà el fitxer original i el fitxer temporal es mourà al seu lloc.

Pas 4

Aquest script s'iniciarà de la mateixa manera que l'anterior:

$ fileName = "allStrings.txt";

$ lineToKill = 44;

A continuació, heu de crear un fitxer temporal per treballar. Fem-ho a la carpeta "tmp" i donem el mateix prefix al fitxer temporal: $ tempFile = tempnam ("/ tmp", "tmp"); ara intentem obrir el fitxer font per llegir-lo: if ($ fileHandle = @fopen ($ fileName, "rb")) {

// aquest codi s'executarà en cas d'obertura normal del fitxer font

} Si això falla - no té sentit un altre treball de l'script, acabem amb el procés amb l'emissió del missatge corresponent: en cas contrari morirem ("El fitxer font no existeix!"); Si el fitxer es va obrir normalment, imprimirà una notificació sobre això i intentarà obrir el fitxer temporal creat anteriorment amb el missatge corresponent: echo "El fitxer font existeix";

if ($ tempHandle = fopen ($ tempFile, "w")) echo "S'ha creat un fitxer temporal."; Ara és hora d'iniciar un bucle de línies de lectura des del fitxer font, que continuarà fins que arribi al final de el fitxer: while (! feof ($ fileHandle)) {

// aquí hi haurà el codi per treballar amb la línia actual

} A cada pas del bucle, llegirem una línia: $ lineToWrite = fgets ($ fileHandle); i si aquesta no és la línia a suprimir, escriviu-la a un fitxer temporal. El comptador de línia $ lineNum s'incrementarà directament a l'operació de comparació: if ($ lineToKill! = (++ $ lineNum)) fwrite ($ tempHandle, $ lineToWrite); Quan les línies s'esgotin, tanqueu el fitxer: fclose ($ fileHandle);

fclose ($ tempHandle); Finalment, canvieu el nom del fitxer temp al original. Si aquesta operació té èxit, llançarem el missatge corresponent: if (rename ($ tempFile, $ fileName)) echo "La línia $ lineToKill s'ha suprimit";

Pas 5

Codi complet:

<? php $ fileName = "allStrings.txt";

$ lineToKill = 44; $ tempFile = tempnam ("/ tmp", "tmp");

if ($ fileHandle = @fopen ($ fileName, "rb")) {)

echo "El fitxer font existeix";

if ($ tempHandle = fopen ($ tempFile, "w")) echo "S'ha creat un fitxer temporal.";

}

else die ("El fitxer font no existeix!"); while (! feof ($ fileHandle)) {

$ lineToWrite = fgets ($ fileHandle);

if ($ lineToKill! = (++ $ lineNum)) fwrite ($ tempHandle, $ lineToWrite);

} fclose ($ fileHandle);

fclose ($ tempHandle);

if (canviar el nom ($ tempFile, $ fileName)) ressona "Línia $ lineToKill eliminada";?>

Recomanat: