Jinsi Ya Kuondoa Laini Kutoka Kwa Faili

Orodha ya maudhui:

Jinsi Ya Kuondoa Laini Kutoka Kwa Faili
Jinsi Ya Kuondoa Laini Kutoka Kwa Faili

Video: Jinsi Ya Kuondoa Laini Kutoka Kwa Faili

Video: Jinsi Ya Kuondoa Laini Kutoka Kwa Faili
Video: JINSI YA KUKUZA MASHINE YAKO ILI MPENZI WAKO,MKE WAKO ASICHEPUKE . 2024, Mei
Anonim

Wakati wa kufanya kazi na data ndogo katika PHP, wakati mwingine ni rahisi kuzihifadhi kwenye faili kuliko kuunda hifadhidata na kupanga mwingiliano wa hati nayo. Katika hali kama hizo, jukumu la kufuta mistari maalum kutoka kwa faili ya maandishi sio kawaida. Wacha tuangalie kwa karibu njia rahisi zaidi ya kufanya hivyo.

PHP: jinsi ya kuondoa laini kutoka kwa faili
PHP: jinsi ya kuondoa laini kutoka kwa faili

Muhimu

Ujuzi wa kimsingi wa PHP

Maagizo

Hatua ya 1

Takwimu za awali:

- tuna faili ya maandishi allStrings.txt, ambayo ina idadi ya mistari ya data

- inahitajika kufuta laini Namba 44 kutoka kwa faili

Algorithm ya kusuluhisha shida itakuwa kama ifuatavyo: unahitaji kufungua faili, soma mistari iliyomo ndani yake katika safu ya nyuzi na andika faili iliyopo na yaliyomo kwenye safu, ukiruka laini iliyokusudiwa kufutwa.

Hatua ya 2

Ili kutekeleza algorithm hii katika hati, kwanza tunapeana maadili kwa vigeuzi ambavyo vitakuwa na jina la faili ya chanzo na nambari ya laini itafutwa: $ fileName = "allStrings.txt";

Basi hebu tusome faili hiyo katika safu ya masharti: Nambari yote zaidi itatekelezwa ikiwa hali ya $ lineToKill sio zaidi ya idadi ya mistari kwenye safu ya $ stringsArray: ikiwa ($ lineToKill <= count ($ stringsArray)) {

// hii itakuwa kitanzi kuu cha programu

} Ikiwa hali haijatimizwa, basi hatuna cha kufuta. Acha hati ichapishe ujumbe wa habari juu ya hii: vingine virudie "Idadi ya mistari kwenye faili ni chini ya". $ LineToKill. "!"; Ikiwa hali hiyo imetimizwa, unapaswa kufuta faili ya chanzo kwa kuingia mpya: $ fileHandle = fopen ($ fileName, "w"); Sasa tunapaswa kuandaa kitanzi kinachozunguka juu ya vitu vyote vya safu ya kamba. Lakini kwa kuwa upangaji wa safu unaanza kutoka sifuri, na tulihesabu nambari ya laini ya kufutwa kutoka kwa moja, basi hata kabla ya kuanza kwa kitanzi tutapunguza thamani ya $ lineToKill kwa moja, ili usirudie operesheni hii kwa kila hatua: $ lineToKill -; Kupanga kitanzi: foreach ($ stringsArray as $ key => $ value) {

// hapa ni nambari ya kila hatua ya kitanzi

} Tofauti ya ufunguo wa $ itakuwa na faharisi ya mstari wa sasa katika safu, na kutofautisha kwa thamani ya $ itakuwa na thamani ya laini hii. Katika kila hatua ya kitanzi, tutalinganisha faharisi ya mstari katika safu na nambari itafutwa, na ikiwa hazilingani, basi tutaandika thamani ya mstari huu kwa faili: ikiwa ($ key! = $ LineToKill) fwrite ($ fileHandle, $ value); ikiwa zinalingana, basi hatutaandika kwa faili hiyo, lakini tutachapisha ujumbe kuhusu kufutwa kwa mafanikio: mwingine echo "Line". $ LineToKill. "Ilifutwa."; Na mwishoni mwa mzunguko, wakati kuandika faili kumalizika, unapaswa kuifunga kwa adabu: fclose ($ fileHandle);

Hatua ya 3

Nambari kamili itaonekana kama hii: <? Php $ fileName = "allStrings.txt";

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

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

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

$ line Kuua -;

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

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

mwingine echo "Line". $ lineToKill. "ilifutwa.";

}

fclose ($ fileHandle);

}?> Kwa kweli, hii ndio nambari rahisi zaidi, ambayo hakuna kinga dhidi ya shida zote ambazo zinaweza kutokea wakati wa kazi ya hati hiyo katika hali halisi. Kwa mfano, ikiwa faili ina idadi kubwa ya mistari, kisha kuisoma katika safu itauma chunk ambayo ni kubwa sana kwa hati moja kutoka kwa rasilimali za seva. Kwa kweli, fanya kazi na data nyingi inapaswa kupangwa kupitia hifadhidata, sio faili za maandishi. Lakini bado, kama mfano wa elimu, tutatoa nambari inayotatua shida hii pia. Hapa algorithm itakuwa tofauti na ile ya awali: ili usiweke idadi kubwa ya mistari katika safu, hati hiyo itasoma kutoka kwa faili ya chanzo laini moja kwa wakati na kuziandika moja kwa moja hadi faili ya muda. Mwisho wa mchakato huu, faili asili itafutwa, na faili ya muda itahamishiwa mahali pake.

Hatua ya 4

Hati hii itaanza kwa njia ile ile kama ile ya awali:

$ fileName = "allStrings.txt";

$ lineToKill = 44;

Kisha unahitaji kuunda faili ya muda ili ufanye kazi. Wacha tufanye kwenye folda ya "tmp" na tupe kiambishi sawa kwa faili ya muda: $ tempFile = tempnam ("/ tmp", "tmp"); Sasa wacha tujaribu kufungua faili ya chanzo ya kusoma: ikiwa ($ fileHandle = @fopen ($ fileName, "rb")) {

// nambari hii itafanywa ikiwa kuna ufunguzi wa kawaida wa faili chanzo

} Ikiwa hii inashindwa - kazi zaidi ya hati haina maana, tunaua mchakato na utoaji wa ujumbe unaofanana: vingine kufa ("Faili ya chanzo haipo!"); Ikiwa faili ilifunguliwa kawaida, basi sisi itachapisha arifa juu ya hii na kujaribu kufungua faili ya muda iliyoundwa hapo awali na ujumbe unaofanana: echo "Faili ya chanzo ipo";

ikiwa ($ tempHandle = fopen ($ tempFile, "w")) echo "Faili ya muda imeundwa."; Sasa ni wakati wa kuanza kitanzi cha mistari ya kusoma kutoka kwa faili chanzo, ambayo itaendelea hadi ifike mwisho wa faili: wakati (! feof ($ fileHandle)) {

// hapa itakuwa nambari ya kufanya kazi na laini ya sasa

} Katika kila hatua ya kitanzi, tutasoma mstari mmoja: $ lineToWrite = fgets ($ fileHandle); Na ikiwa hii sio laini ya kufutwa, basi iandikie faili la muda. Laini ya kukabiliana na $ lineNum itaongezwa moja kwa moja katika operesheni ya kulinganisha: ikiwa ($ lineToKill! = (++ $ lineNum)) fwrite ($ tempHandle, $ lineToWrite); Mistari itakapokwisha, funga faili: fclose ($ fileHandle);

fclose ($ tempHandle); Mwishowe, badilisha faili ya temp kwa ile ya asili. Ikiwa operesheni hii imefanikiwa, basi tutatoa ujumbe unaofanana: ikiwa (rename ($ tempFile, $ fileName)) ikirudia "Laini ya $ lineToKill imefutwa";

Hatua ya 5

Nambari kamili:

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

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

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

echo "Faili ya chanzo ipo";

ikiwa ($ tempHandle = fopen ($ tempFile, "w")) echo "Faili ya muda imeundwa.";

}

mwingine afe ("Faili ya chanzo haipo!"); wakati (! feof ($ fileHandle)) {

$ lineToWrite = fgets ($ fileHandle);

ikiwa ($ lineToKill! = (++ $ lineNum)) andika ($ tempHandle, $ lineToWrite);

} fclose ($ fileHandle);

fclose ($ tempHandle);

ikiwa (rename ($ tempFile, $ fileName)) echo "Line $ lineToKill imeondolewa";?>

Ilipendekeza: