Kako Ukloniti Redak Iz Datoteke

Sadržaj:

Kako Ukloniti Redak Iz Datoteke
Kako Ukloniti Redak Iz Datoteke

Video: Kako Ukloniti Redak Iz Datoteke

Video: Kako Ukloniti Redak Iz Datoteke
Video: Как нарастить корни Орхидеи / Как раскуклить корни перед посадкой в грунт / Разбираем Леко Фантастик 2024, Prosinac
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 redak iz datoteke
PHP: kako ukloniti redak iz datoteke

Potrebno

Osnovno znanje PHP-a

Upute

Korak 1

Početni podaci:

- imamo tekstualnu datoteku allStrings.txt, koja sadrži brojne podatkovne retke

- potrebno je izbrisati redak br. 44 iz datoteke

Algoritam rješavanja problema bit će sljedeći: trebate otvoriti datoteku, pročitati retke koji 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. Svi daljnji kod izvršit će se samo ako uvjet $ lineToKill nije veći od broja redaka u polju $ stringsArray: 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 tome: else echo "Broj redaka u datoteci je manji od". $ LineToKill. "!"; Ako je uvjet zadovoljen, 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 retka za brisanje izbrojali smo od jednog, čak i prije početka petlje smanjit ćemo 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 trenutnog retka u polju, a varijabla $ value sadržavat će vrijednost ovog retka. Na svakom koraku petlje uspoređivat ćemo indeks retka u nizu s brojem koji treba izbrisati, a ako se ne podudaraju, tada ćemo vrijednost ovog retka zapisati 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, kada je pisanje u datoteku završeno, trebali biste ga pristojno zatvoriti: fclose ($ fileHandle);

3. korak

Kompletni kod izgledat će 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 ($ key! = $ lineToKill) fwrite ($ fileHandle, $ value);

inače odjekuje "Linija". $ lineToKill. "izbrisano.";

}

fclose ($ fileHandle);

}?> Naravno, ovo je najjednostavniji kod u kojem nema zaštite od svih komplikacija koje se mogu pojaviti tijekom rada skripte u stvarnim uvjetima. Na primjer, ako datoteka sadrži ogroman broj redaka, tada ć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 velik broj redaka u polje, skripta će čitati iz izvorne datoteke jedan po jedan redak i upisivati ih jedan po jedan u privremenu datoteku. Na kraju ovog postupka izvorna datoteka bit će izbrisana, a privremena datoteka premještena na svoje mjesto.

4. korak

Ova će skripta započeti 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 damo isti prefiks privremenoj datoteci: $ tempFile = tempnam ("/ tmp", "tmp"); Pokušajmo sada otvoriti izvornu datoteku za čitanje: if ($ fileHandle = @fopen ($ fileName, "rb")) {

// ovaj će se kôd 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 "Stvorena je privremena datoteka."; Sada je vrijeme da započnemo petlju čitanja redaka iz izvorne datoteke, koja će se nastaviti sve dok ne pogodi kraj datoteka: while (! feof ($ fileHandle)) {

// ovdje će biti kod za rad s trenutnim retkom

} 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 izravno će se povećati u operaciji usporedbe: if ($ lineToKill! = (++ $ lineNum)) fwrite ($ tempHandle, $ lineToWrite); Kada crte ponestanu, zatvorite datoteku: fclose ($ fileHandle);

fclose ($ tempHandle); Konačno, preimenujte privremenu datoteku u izvornu. Ako je ova operacija uspješna, tada ćemo izdati odgovarajuću poruku: if (rename ($ tempFile, $ fileName)) echo "Redak $ 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 stvorena.";

}

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čeni: