Kako Ukloniti Liniju Iz Datoteke

Sadržaj:

Kako Ukloniti Liniju Iz Datoteke
Kako Ukloniti Liniju Iz Datoteke

Video: Kako Ukloniti Liniju Iz Datoteke

Video: Kako Ukloniti Liniju Iz Datoteke
Video: Datoteka, kreiranje datoteke 2024, Maj
Anonim

Kada radite s malim količinama podataka u PHP-u, ponekad je lakše pohraniti ih u datoteke nego stvoriti bazu podataka i organizirati interakciju skripti s njom. U takvim slučajevima zadatak brisanja navedenih redaka iz tekstualne datoteke nije rijedak. Pogledajmo bliže najjednostavniji mogući način za to.

PHP: kako ukloniti liniju iz datoteke
PHP: kako ukloniti liniju iz datoteke

Potrebno

Osnovno znanje PHP-a

Instrukcije

Korak 1

Početni podaci:

- imamo tekstualnu datoteku allStrings.txt, koja sadrži brojne linije podataka

- potrebno je izbrisati red br. 44 iz datoteke

Algoritam za rješavanje problema bit će sljedeći: trebate otvoriti datoteku, pročitati linije koje se u njoj nalaze u niz nizova i prepisati postojeću datoteku sadržajem niza, preskačući redak koji se želi izbrisati.

Korak 2

Da bismo implementirali ovaj algoritam u skriptu, prvo dodjeljujemo vrijednosti varijablama koje će sadržavati ime izvorne datoteke i broj retka koji se briše: $ fileName = "allStrings.txt";

$ lineToKill = 44; Zatim pročitajmo datoteku u niz nizova: $ stringsArray = datoteka ($ fileName); Provjerimo sadrži li datoteka redak koji nam treba. Sav daljnji kôd izvršit će se samo ako uvjet $ lineToKill nije veći od broja linija u $ stringsArray nizu: if ($ lineToKill <= count ($ stringsArray)) {

// ovo će biti glavna petlja programa

} Ako uvjet nije ispunjen, tada nemamo što izbrisati. Neka skripta ispiše informativnu poruku o ovome: else echo "Broj redova u datoteci je manji od". $ LineToKill. "!"; Ako je uvjet ispunjen, trebali biste obrisati izvornu datoteku za novi unos: $ fileHandle = fopen ($ fileName, "w"); Sada bismo trebali organizirati petlju koja se ponavlja kroz sve elemente niza nizova. No, budući da indeksiranje niza započinje od nule, a broj linije za brojanje smo brojali od jednog, čak ćemo i prije početka petlje smanjiti vrijednost $ lineToKill za jedan, kako ne bismo ponavljali ovu operaciju u svakom koraku: $ lineToKill -; Za organiziranje petlje: foreach ($ stringsArray kao $ key => $ value) {

// ovdje je kôd svakog koraka petlje

} Varijabla $ key sadržavat će indeks trenutne linije u polju, a varijabla $ value sadržavat će vrijednost ove linije. Na svakom koraku petlje uspoređivat ćemo indeks retka u nizu s brojem koji treba izbrisati, a ako se ne podudaraju, vrijednost ovog retka zapisat ćemo u datoteku: if ($ key! = $ LineToKill) fwrite ($ fileHandle, $ value); A ako se podudaraju, nećemo pisati u datoteku, već ispisati poruku o uspješnom brisanju: else echo "Line". $ LineToKill. "Delete."; I na kraju ciklusa, po završetku pisanja u datoteku, pristojno ga zatvorite: fclose ($ fileHandle);

Korak 3

Kompletni kod će izgledati ovako: <? Php $ fileName = "allStrings.txt";

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

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

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

$ lineToKill--;

foreach ($ stringsArray kao $ key => $ value) {

if ($ ključ! = $ lineToKill) fwrite ($ fileHandle, $ vrijednost);

else echo "Line". $ lineToKill. "izbrisano.";

}

fclose ($ fileHandle);

}?> Naravno, ovo je najjednostavniji kod u kojem nema zaštite od svih komplikacija koje se mogu pojaviti tokom rada skripte u stvarnim uvjetima. Na primjer, ako datoteka sadrži ogroman broj linija, onda će ih čitanje u niz odgristi dio koji je nedopustivo velik za jednu skriptu iz resursa poslužitelja. Naravno, rad s velikim količinama podataka treba organizirati putem baza podataka, a ne tekstualnih datoteka. Ali ipak, kao obrazovni primjer, dat ćemo kod koji rješava i ovaj problem. Ovdje će se algoritam razlikovati od prethodnog: kako ne bi pohranio ogroman broj linija u polje, skripta će čitati iz izvorne datoteke jedan po jedan redak i upisivati ih jednu po jednu u privremenu datoteku. Na kraju ovog postupka izvorna datoteka će se izbrisati, a privremena datoteka će se premjestiti na svoje mjesto.

Korak 4

Ova skripta započet će na isti način kao i prethodna:

$ fileName = "allStrings.txt";

$ lineToKill = 44;

Zatim trebate stvoriti privremenu datoteku za rad. Učinimo to u mapi "tmp" i dajmo isti prefiks privremenoj datoteci: $ tempFile = tempnam ("/ tmp", "tmp"); Pokušajmo sada otvoriti izvornu datoteku za čitanje: if ($ fileHandle = @fopen ($ fileName, "rb")) {

// ovaj kod će se izvršiti u slučaju normalnog otvaranja izvorne datoteke

} Ako ovo ne uspije - daljnji rad skripte nema smisla, ubijamo postupak izdavanjem odgovarajuće poruke: else die ("Izvorna datoteka ne postoji!"); Ako je datoteka normalno otvorena, tada ispisat će obavijest o tome i pokušati otvoriti prethodno stvorenu privremenu datoteku s odgovarajućom porukom: echo "Izvorna datoteka postoji";

if ($ tempHandle = fopen ($ tempFile, "w")) echo "Privremena datoteka je stvorena."; Sada je vrijeme da započnemo petlju čitanja redova iz izvorne datoteke, koja će se nastaviti sve dok ne pogodi kraj datoteka: while (! feof ($ fileHandle)) {

// ovdje će biti kod za rad s trenutnom linijom

} Na svakom koraku petlje čitat ćemo po jedan redak: $ lineToWrite = fgets ($ fileHandle); A ako ovo nije redak koji treba izbrisati, zapišite ga u privremenu datoteku. Brojač linija $ lineNum bit će izravno uvećan u operaciji upoređivanja: if ($ lineToKill! = (++ $ lineNum)) fwrite ($ tempHandle, $ lineToWrite); Kada crte ponestanu, zatvorite datoteku: fclose ($ fileHandle);

fclose ($ tempHandle); Konačno, preimenujte privremenu datoteku u originalnu. Ako je ova operacija uspješna, tada ćemo izdati odgovarajuću poruku: if (preimenovati ($ tempFile, $ fileName)) echo "Red $ lineToKill je izbrisan";

Korak 5

Potpuni kod:

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

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

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

echo "Izvorna datoteka postoji";

if ($ tempHandle = fopen ($ tempFile, "w")) echo "Privremena datoteka je kreirana.";

}

else die ("Izvorna datoteka ne postoji!"); while (! feof ($ fileHandle)) {

$ lineToWrite = fgets ($ fileHandle);

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

} fclose ($ fileHandle);

fclose ($ tempHandle);

if (preimenovati ($ tempFile, $ fileName)) echo "Line $ lineToKill uklonjen";?>

Preporučuje se: