PHP Centeri avaleht Skriptikogu Küsimuste-vastuste leht Teadete vaatamine ja saatmine Foorum - koht küsimiseks Otsingumootor Siit saad infot meie kohta

Kasutajanimi:  
  Parool: 
  Registreeri!   Unustasid salasõna?

 Skriptid (427) 

 Bannerisüsteemid
 E-kaardid
 E-maili saatmine
 E-poed
 Failihaldus
 Flash ja PHP
 Foorumid
 Jututoad
 Kalendrid
 Kalkulaatorid
 Kellad
 Klikilugejad
 Kommentaarid
 Külalisteraamatud
 Küsitlused
 Lehe turvamine
 Lingikogud
 Mängud
 Otsingusüsteemid
 Pildid ja PHP
 Shoutboxid
 Sisuhaldussüsteemid
 Statistika
 Suunamine
 Templeidisüsteemid
 Testid
 Uudised
 Uudistelistid
 Varia


 Otsing 

 

 Utiliidid 

 Kes on kus
 Kasutajate info
 Küsitlused
 PHP manuaal
 Õpetused
 Jututuba
 Lingikogu
 Lemmikskriptid


 Tekstifailide käsitlemine
Autor: laurik
Pühapäev, 07. september 2003 21:07
Tekstifailide käsitlemine

Järgnevalt on vaatluse all tekstifailide (sh ini ja csv) kasutamise põhivõtted.


Sisukord:
+ Tekstifailide kasutamine
~ Faili loomine
~ Failisisu kuvamine
~ Rea kustutamine
~ Mitme välja salvestamine ühele reale
~ Failisisu kuvamine kui real on mitu välja
~ Failisisu muutmine kui real on mitu välja
~ Failisisu muutmine (loenduri näitel)
~ Faili kustutamine
+ CSV failid
+ INI failid



Tekstifailide kasutamine

Uue faili loomine toimub järgmiselt (N*IX süsteem nõuab töökataloogi CHMOD-imist 777-le):

PHP kood:


$fp=fopen('fail.txt','w'); // faili avamine
fputs($fp,"rida1\n"); // rea lisamine
fputs($fp,"rida2\n"); // teise rea lisamine
fclose($fp); // faili sulgemine



Funktsiooni fopen() esimeseks parameetriks on failinimi ja teiseks avamise viis -- viimane võib olla:

'r' - ainult lugemiseks
'r+'- lugemiseks ja kirjutamiseks, osuti (pointer) viiakse faili algusesse
'w' - ainult kirjutamiseks, kui faili ei ole siis see tehakse
'w+'- kirjutamiseks ja lugemiseks. Fail tehakse tühjaks ning osuti viiakse faili algusesse, kui faili ei ole siis see tehakse
'a' - ainult lõppukirjutamiseks, osuti viiakse faili lõppu, kui faili ei ole siis see tehakse
'a+'- lugemiseks ja kirjutamiseks, osuti viiakse faili lõppu, kui faili ei ole siis see tehakse

«« Sisukord



Failisisu kuvamine

Seda saab teha vähemalt kahel viisil, esiteks pikem versioon:

PHP kood:


$in "inputfile.txt"// kuvatava faili nimi
// faililugemisega jätkatakse ainult juhul kui fail eksisteerib
if (file_exists($in)) {
$handle fopen ($in"r");
// jätkatakse kuni tegemist ei ole faililõpu tähisega (End Of File)
while (!feof ($handle)) {
$buffer .= fgets($handle4096);
}
fclose ($handle);
echo 
$buffer;
}
else {
echo 
"Ei leitud faili {$in}";
}




Sama tulemuse saab ka järgmise koodilõiguga:

PHP kood:


$in "inputfile.txt"// kuvatava faili nimi
if (file_exists($in))
$buffer implode('<br>'file($in));
else
$buffer 'Faili '.$in.' avamine ebaõnnestus :´-(';
print 
$buffer;



file() funktsioon saab parameetriks faili nime ning tagastab massiivina (array) faili sisu, igaks massiivi elemendiks üks rida. implode() funktsioon moodustab massiivist stringi lisades elementide vahele mingi teksti, antud juhul line breigi.

«« Sisukord



Rea kustutamine failist.

Rea kustutamiseks tuleb failisisu massiivi lugeda ning salvestamisel üleliigne (või üleliigsed) read vahelt välja jätta.

PHP kood:


$failinimi 'isikud.txt';
# kustutatava reanr, tegelikult kustutatakse antud juhul failist 3-s rida
# kuna file() -ga loetav jada algab 0-st, niiet sellega tuleb arvestada

$reanr 2;
if (
file_exists($failinimi))
{
$failisisu file($failinimi);

$i=-1;
$fp=fopen($failinimi'w');
foreach(
$failisisu as $rida)
{
$i++;
if (
$i<>$reanr)
fputs($fp,trim($rida)."\n");
}
fclose($fp);
}
else
{
print 
"Ei leitud faili " $failinimi;
}



Alternatiiv rea kustutamiseks on unset() -ga ebavajalik(ud) read massiivist eemaldada ja seejärel muutuja sisu väljundfaili kirjutada:

PHP kood:


$failinimi 'isikud.txt';
$reanr 2;

# kui fail eksisteerib
if (file_exists($failinimi))
{
# siis loeme failisisu massiivi
$failisisu file($failinimi);

# eemaldame nõutud rea
unset($failisisu[$reanr]);

# ning kirjutame sisu tagasi faili
$fp=fopen($failinimi'w');
fputs($fpimplode(''$failisisu));
fclose($fp);
}
else
{
print 
"Ei leitud faili " $failinimi;
}



«« Sisukord



Mitme välja salvestamine ühele reale

Tihtilugu on ühele reale mõtekas salvestada mitu välja, nt oletame et on fail isikud siis ühel real võiks olla isiku nimi, vanus, sugu, näiteks hobid ja lisamise aeg.


PHP kood:


# defineerime kõigepealt funktsiooni, mis asendab muutujas
# väljaeraldaja html-ekvivalendiga -- vastasel korral võib juhuslik
# väljaeraldaja muutujas pärastist faililugemist segama hakata
function escape($string$delimiter="|"$delimiter_replacement="&brvbar;")
{
return 
str_replace($delimiter,$delimiter_replacement,$string);
}

$d " · "# väljaeraldaja
$r " &middot; "# väljaeraldaja asendus

# need muutujad võivad tulla formilt kuid
# lihtsuse mõttes olgu need siinsamas defineeritud
$nimi escape("Tema Ise"$d$r);
$vanus escape(18$d$r);
$sugu escape("M"$d$r);
$hobid escape("kalalkäik & raadioamatöörlus"$d$r);
$aeg time();

# loome muutujatest jada
$jada array($nimi,$vanus,$sugu,$hobid,$aeg);

# lisame iga jadaelemendi vahele väljaeraldaja (|)
$rida implode($d$jada);

# avame väljundfaili ning salvestame selle lõppu rea
$fp fopen('isikud.txt','a');

# lukustame faili kirjutamiseks et keegi teine samal ajal ei saaks salvestada
flock($fp,2);
fputs($fp,$rida."\n");
fclose($fp);



«« Sisukord



Sellise faili kuvamine toimub niiviisi:

PHP kood:


$failinimi='isikud.txt';
$d " · "# väljaeraldaja

if (file_exists($failinimi))
{
$failisisu file($failinimi);

# jätkame juhul kui failis on vähemalt 1 rida
if (is_array($failisisu) && count($failisisu))
{
print 
'<table border="2">';

# käime failsisu rida-realt läbi
foreach($failisisu as $rida)
{
$rida trim($rida); # eemaldame realõpust tühikud kaasaarvatud reavahetused

# loome reast jada, kasutades selleks väljaeraldajat $d
$jada explode($d,$rida);

# need print read oleks võinud muidugi ühele reale kirjutada...
print "<tr>\n";
print 
"<td>$jada[0]</td>";
print 
"<td>$jada[1]</td>";
print 
"<td>$jada[2]</td>";
print 
"<td>$jada[3]</td>";
print 
"<td>".date("d-m-Y H:i:s"$jada[4])."</td>\n";
print 
"</tr>\n";
}
print 
"</table>";
}
else
{
print 
"Fail on tühi!";
}
}
else
{
print 
'Ei leitud faili ' $failinimi;
}






«« Sisukord


Reasisu muutmine tekstifailis

Muutmine käib jällegi viisil, kus failisisu loetakse massiivi ning vajalik rida lammutatakse explode() -ga väljadeks (mis on samuti masiiv), ning peale muudatuste tegemist pannakse väljad implode() -ga uuesti kokku ning lisatakse esialgsesse failisisu massiivi.

Olgu meil fail isikud.txt, mille sisuks on:
tema ise · 18 · M · kalalkäik & raadioamatörism · 1048953375
meie maie · 22 · N · ratbaigindus · 1048954234
keegi kolmas · 24 · M · militaarteema · 1048956372

Ja oletame et vaja oleks meie maie reas muuta vanus 23-ks ning hobiks lisada tuuba mängimine. Selleks tuleks teha umbes nii:

PHP kood:


$failinimi 'isikud.txt';
$d " · ";

# funktsioon salvestab jada faili
function save_file($filename$array$flock=true)
{
$fp fopen($filename'w');
$flock flock($fp2) : 0;
foreach(
$array as $line)
{
fputs($fprtrim($line)."\n");
}
fclose($fp);

if(
file_exists($filename)) return true;
else return 
false;
}

if (
file_exists($failinimi))
{
$failisisu file($failinimi);
$i=-1;
foreach(
$failisisu as $rida)
{
$i++;
$jada explode($d$rida);

# if-tingimuse võib määrata ka reanumbriga 1 (muudetakse faili teist rida)
if ($jada[0]=='meie maie')
{
$jada[1] = 23;
$jada[3].=' tuuba mängimine';
$rida implode($d,$jada);
$failisisu[$i] = $rida;
}
}

if (
save_file($failinimi,$failisisu)) print "Fail $failinimi muudetud!";
else print 
"Failisalvestus ebaõnnestus";
}
else
{
print 
"Ei leitud faili " $failinimi;
}




«« Sisukord




Väike näide, mis ka midagi kasulikku teeb -- veebilehe külastusloendur:

PHP kood:


$filename "counter.txt";
# olenevalt sellest, kas fail eksisteerib luuakse uus fail või kirjutatakse vana üle
$counterfile file_exists$filename ) ? fopen$filename"r+" ) : fopen$filename,"w+" );
flock$counterfile);# fail lukustatakse kirjutamiseks -- samal ajal ei saa keegi teine sellesse faili kirjutada
if ( $counterfile ) {
$counter fgets$counterfile99 ); # loetakse 99 märki pikkune tekst
$counter intval$counter ) + 1# loetud andmed teisendatakse täisarvuks ning väärtust suurendatakse ühe võrra
fseek($counterfile0); fgets() -ga nihkunud osuti liigutatakse tagasi algusesse
fputs$counterfile$counter ); # faili lisatakse uuenenud loenduri väärtus
}
fclose$counterfile ); # fail suletakse
echo "Külastusi alates 26.08.2003: $counter"# ja näidatakse külastuste arvu



«« Sisukord



Faili kustutamine

Funktsioon faili lõplikuks kustutamiseks on unlink().

PHP kood:

 unlink('inputfile.txt'); 



«« Sisukord




CSV failid

CSV faile oskavad käsitleda nii MS Excel kui ka MySQL (ja muidugi veel paljud teisedki aplikatsioonid), nii et selles suhtes on mugav - vajadusel saab andmeid importida Exceli tabelist või eksportida MySQL-i.

CSV on lühend sõnadest Comma Separated Values ja sellega on ka failiformaat kirjeldatud -- väärtused on üksteisest eraldatud komaga:

Koodijupp:

1,keegi,"mingi asi","veel ""midagi"""
2,veel_keegi,tron,jiolega



Nagu näha, lisatakse mitmesõnalised väärtused jutumärkidesse. Kui väli sisaldab jutumärki siis see varjestatakse teise jutumärgiga.

Ainuke funktsioon, mida PHP CSV-failide otseseks käsitlemiseks pakub (kuid sellest ka enamvähem piisab on

Koodijupp:
fgetcsv ( resource handle, int length [, string delimiter [, string enclosure]])


Argumendid on:

handle - fopen() -ga avatud fail
length - pikkus märkides, peab olema suurem kui kõige pikem rida CSV failis

valikulised argumendid on
delimiter - väljaeraldaja (vaikimisi koma)
enclosure - väljapiiraja (vaikimisi jutumärgid)

fgetcsv() tagastab massiivi vastaval real olevate väljadega.


Järgnev skriptilõik trükib CSV-failist järjest reanumbri, väljade arvu antud real ning väljasisu:

PHP kood:


$row 1;
$handle fopen ("test.csv","r");
while (
$data fgetcsv ($handle1000",")) {
$num count ($data);
print 
"<p> $num fields in line $row: <br>\n";
$row++;
for (
$c=0$c $num$c++) {
print 
$data[$c] . "<br>\n";
}
}
fclose ($handle);




Kui on soov mõnd CSV väärtust/rida muuta või kustutada siis tuleks sarnaselt tekstifailide töötlusega failisisu esiteks massiivi lugeda, teha vastavad muudatused ning seejärel massiivisisu taas faili salvestada.

Massiivi moodustamine võib toimuda sedaviisi:

PHP kood:


$handle fopen ("test.csv""r");
if(
$handle) {
while(
$array[] = fgetcsv($handle4096));
}
fclose ($handle);



Teades muudetava rea ja ka tulba numbrit saab massiivis muudatusi teha järgmiselt:

PHP kood:


$array[0][0] = 0// id -- esimese rea esimene tulp
$array[0][2] = 'Õige magus'// mingi uus väärtus -- esimese rea kolmas tulp



Kui aga täpset reanumbrit pole teada, kuid soovitakse kustutada rida, mille esimeses tulbas olev väärtus on 10 siis see toimuks selliselt:

PHP kood:


foreach($array as $line_nr=>$line) {
if (
$line[0]==10unset($line_nr);
break;
}



Kui soovitakse muuta kõiki ridasid, milles esimene väli on 10 siis tuleks see 'break' korraldus vahelt ära koristada.

Tehtud muudatuste kinnistamiseks tuleb massiivi sisu tagasi faili salvestada. Eelnevalt tuleks väljades sisalduvad jutumärgid varjestada (escape -da -- lisada jutumärgile teine jutumärk) ning juhul kui väli sisaldab tühikut või koma siis tuleb antud väli ümbritseda jutumärkidega. See toimub näiteks sedaviisi:

PHP kood:



# funktsioon vajalike jutumärkide lisamiseks / varjestamiseks
function csv_addslashes($array) {
if (!
is_array($array)) return false;
foreach(
$array as $line_nr=>$line) {
if (
is_array($line)) // jätkame ainult kui rida ei ole tühi
foreach($line as $column_nr=>$field) {
$field str_replace('"''""'$field);
(
strstr($field,' ') || strstr($field,',')) ? $field='"'.$field.'"' 0;
$xarray[$line_nr][$column_nr] = $field// lisame välja uude massiivi
}
}
return 
$xarray;
}

# loeme failisisu massiivimuutujasse
$handle fopen ("test.csv""r");
if(
$handle) {
while(
$array[] = fgetcsv($handle4096));
}
fclose ($handle);

# muudame välja
$array[0][2] = 'Õige magus'# uus väärtus -- esimese rea kolmas tulp (indeks väärtused algavad 0-st)

# varjestame jutumärgid
$array csv_addslashes($array);

# avame väljundfaili
$fp fopen("test2.csv""w");

# jalutame read läbi
foreach ($array as $line)
fputs($fpimplode(',',$line)."\n"); # salvestamine. rea lõppu lisame reavahetuse märgi

fclose($fp);

# korras



«« Sisukord





INI failid


Ini-faile kasutatakse reeglina programmide konfiguratsioonisätete salvestamiseks (nt php.ini). Failiformaat on küllaltki lihtne:

Koodijupp:

; kommentaar
[sektsioon1]
muutuja1 = väärtus1

[sektsioon2]
muutuja2 = "väärtus 2"
muutuja3 = "väärtus number 3"



INI-failide parsimiseks on PHP-s funktsioon parse_ini_file($failinimi, $sektsioonidega_arvestamine)

Esimeseks parameetriks on parsitava faili nimi, teine võib olla kas TRUE või FALSE; TRUE korral moodustatakse mitmemõõtmeline massiiv (st. erinevates sektsioonides saab kasutada samanimelisi muutujaid). Vaikimisi on teise parameetri väärtuseks FALSE.

Oletame, et ülaltoodud INI-faili sisu on salvestatud faili test.ini, siis sellest andmete kättesaamine toimub nii:

PHP kood:


$ini1 parse_ini_file('test.ini');
print 
$ini1['muutuja1'].'<br>'// väärtus1



Või kui teine argument on true siis:

PHP kood:


$ini2 parse_ini_file('test.ini'true);
print 
$ini2['sektsioon2']['muutuja3']; // väärtus number 3



Kui soovitakse ini-failis olevad muutujad teisendada koheselt PHP globaalmuutujateks siis lihtsaim võimalus selleks on:

PHP kood:


extract(parse_ini_file('test.ini'));



Nüüd on võimalik:

PHP kood:


print $muutuja1.'<br>';
print 
$muutuja3;



jne.

INI-failide muutmiseks PHP-s sisseehitatud funktsioone ei ole, küll aga on tehtud nii mõnedki INI-failide klassid -- neid saab näiteks http://phpclasses.org/ saidilt.

«« Sisukord

http://php.bytez.net/zip/txt-failide-kasutamine.zip <-- siit saab tekstis toodud näited ühe zip-failina

--
Lauri Kasvandik | e-mail



Avaleht   -    Skriptikogu   -    Teated   -    Foorum   -    Reklaam   -    Tagasiside   -    Kasutamise reeglid

© Copyright 2002-2019 PHP Center. Kõik õigused reserveeritud.