složitější čtení ze souboru

Mam soubor "dengraf.dat" do kteráho se ukládají data:
--------------------
7.04.2003#49
6.04.2003#69
5.04.2003#58
4.04.2003#34
3.04.2003#29
2.04.2003#33
1.04.2003#28
31.03.2003#27
30.03.2003#22
29.03.2003#26
28.03.2003#21
27.03.2003#34
26.03.2003#37
25.03.2003#31
--------------------
a chci přecíst pouze 3 řádek za "#" to je pouze číslo 58. Jak to mam udělat? s použitím funkce explode?
$value = explode("#", $row);
echo $value[1]; // vypíše 58

Třetí řádek přečteš pomocí klasického čtení souboru po řádcích v nějakém cyklu (while(!feof(...)), kde si dáš podmínku a při dosažení třetího řádku si zjistíš hodnotu a vyskočíš z cyklu. Nebo se mrkni na funkci file();
ze souboru bych cetl pres $s = file("...");
treti radek je pak v promenne $s[2] ... pak uz staci explode.
$s = file ("dengraf.dat");
explode = ("#", $s[2]);

nebo jak?
$celysouborvpoli = file("dengraf.dat);
$celytretiradek = $celysouborvpoli[2];
$rozdelenytretiradek = explode("#", $celytretiradek);
$tocochces = $rozdelenytretiradek[1];

ty silene nazvy promennych jsem pouzil schvalne pro ilustraci
super, diky, to jsem chtel vědět..
eregi("[0-9]{1,2}\.[0-9]{2}[0-9]{4}\#([0-9]+)", $radek, $reg)

tady budes mit to cislo ty sracko... $reg[1]

asi by sis to neprebral takze:

if (eregi("[0-9]{1,2}\.[0-9]{2}[0-9]{4}\#58", $radek, $reg))
to je ten radek
tohle je na me moc slozity a ani nevim co dela fce eregi, ale dík sem rád za každou radu.
eregi vrací true, pokud $radek obsahuje daný formát - zde 1 až 2 číslice, tečku, dvě číslice, čtyři číslice, # a jakýkoliv počet číslic (2Master, nechybí tam ještě jedna tečka ?). Pokud daný výraz v $radek splňuje dané podmínky, vrátí funkce true a v $reg[0] budeš mít pole výsledku. Protože jsou zde jen jedny závorky, bude to v $reg[1].
ta metoda
$f=file('dengraf.dat');
list(,$n)=explode('#',$f[2])
je asi nejjednodussi, ale u velkych souboru ddost neefektivni - sooboru se musi cely nacist do pole a pak se vyuziji jenom 2 znaky..
jestli ma ten soubor vic nez treba 20kBb tak by bylo lepsi pouzivat fopen + fseek + fread
ten soubor by ale musel mit pevnou sirku radku, takze misto
7.04.2003#49
tam dat treba
07.04.2003#0049
a co kdyby se použilo fgets a do..while a při dosažení potřebného řádku prostě přečetlo danou hodnotu a z cyklu vyskočilo (exit nebo break..nevím přesně).

Taky jsem si říkal, že když bude celý soubor větší, tak je zbytečné to celé tahat do paměti serveru.
no to je takz reseni.. ale kdzy mas sobour o velikosti 200kB s pevnou dylkou zaznamu 20 bytu a chces precist 9000. zaznam tak ti to moc nepomuze (zatimco pomoci fseek+fread muzes opravdu nacist jenom ty 2 byty)

$fp=fopen('dengraf.dat');
fseek($fp,15*$i+11);
$value=(integer)fread($fp,3);

(tohle by slo pouzit na
/(\d{2}\.\d{2}\.\d{4}#\d{3}\r\n)+/
)
no...to je pravda. Nechal jsem se unést tím třetím řádkem a nepřemýšlel nad tím, že by bylo možné přečíst klidně nějaký ke konci.
jo, chyby tam tecka :(
takze oprava:


eregi("[0-9]{1,2}\.[0-9]{2}\.[0-9]{4}\#([0-9]+)", $radek, $reg)

tady je to cislo: $reg[1]

if (eregi("[0-9]{1,2}\.[0-9]{2}\.[0-9]{4}\#58", $radek, $reg)) {

tato podminka plati kdyz je posledni cislo za: # 58

}
2master: hele a k cemu to je.. jestli jsem pochopil dotaz tak cislo radku je dany, takze re tam muzes dat maximalne k rozeknuti na casti - je to ale trochu zbytecny..
osobne bych se priklonil k radku s pevnou delkou (vhodne pro delsi soubory), datum napr. 2003-04-17 (tvuj format d.mm.yyyy je mirne neobvykly) a cislo napr. 0001-9999 nebo podle potreby. pak uz se da funkci fseek() docela presne skocit kam potrebujes aniz bys musel cist soubor od zacatku pripadne cely (znas delku radku i velikost jednotlivych polozek).

a regularni vyrazy bych sem vubec netahal... zbytecne silny kalibr... explode je mnohem vhodnejsi.
Hele, primitivne by se to dalo vlastne vyuzit i mimo dtb ze??? Myslim jmeno#heslo
bohdan: ne, ta dalsi ukazka kodu kontroluje jestli je tam ono cislo 58 nakonci! a RE budou jiste mnohem rychlejsi nez porad neco delit do casti a do promennych, si na to udelej test, uvidis
>a chci přecíst pouze 3 řádek za "#"
ja myslim ze dotaz je jasny, proc kontrolovat spravnost formatu (ta je rekl bych uz zajistena zpusobem vzniku dat..)
a co se re versus explode tyce tak se klidne vsadim ze

eregi("[0-9]{1,2}\.[0-9]{2}\.[0-9]{4}\#([0-9]+)", $radek, $reg)
$val=$reg[1];

je min. 10× pomalejsi nez

list(,$val)=explode('#',$radek);

(mozna kdybys to mel ukotveny, pouzival pcre a nedelal tam tu kontrolu formatu tak to bude o neco rychlejsi, ale proste kdyz si uvedomis jak re pracuji tak ti dojde ze nemuzou byt rychlejsi nez explode)
no ale ono je to v php stejne asi uplne jedno :-)
2 Master: ten test si udelej radsi sam... regularni vyrazy jsou vubec to nejpomalejsi (a nejdokonalejsi), co muzes pouzit... rozdeleni retezce podle daneho znaku je proti tomu hracka.
$data=File("dengraf.dat");
$radek=$data[2];
$delka=StrLen($radek);
$padesat_osm=SubStr($radek,$delka-3,$delka);
//melo by to fungovat...
//je to jednoduší než Explode()...
2 bouchi: kdyz uz... tak php programator by napsal

$n = substr(chop($radek), -2);

1, radky totiz koncivaji ruzne - ja jsem zvykly na chr(10) + char(13), ale muze tam byt pouze jeden ukoncovaci znak.

2, to plati pouze za predpokladu, ze radek koncim cisle, ktere je dvoumistne, coz bych tipoval, ze nemusi byt pravda... takze bud explode(), nebo jak uz jsem psal - pevny format radku a primo fseek()

3, prekvapilo by me, kdyby php bylo case-insensitive, takze tve funkce File(), StrLen() a SubStr() by zrejme nefungovaly... tohle je C-like-language a ne zadny basic