Udtræk fra fil

Tags:    php

<< < 123 > >>
Jeg skal ha lidt hjælp til at trække nogle data ud af en fil.

Jeg har fået styr på at få fat i filen og skrive indholdet af den ud.

Det jeg skal ha hjælp til er hvordan jeg løber filen igennem og får hevet enhelte værdier ud fra den efter nogle "søge" ord.

Lidt data fra selve filen:
[CAREER]
AbortedSeasons=0
TotalLaps=1186
TotalRaces=38
TotalRacesWithAI=30
m.m.

Det første jeg skal ha hevet ud er værdien af TotalLaps.

Lidt længere nede i filen står der følgende:
[PLAYERTRACKSTAT]
TrackName=2003RH_ALBERT_PARK
TrackFile=SEASONDATA\\CIRCUITS\\AUSTRALIA\\2003RH_ALBERT_PARK\\2003RH_ALBERT_PARK
TotalNumLaps=1
BestLapTime=0.000000
[PLAYERTRACKSTAT]
TrackName=2003RH_A-1_RING
TrackFile=SEASONDATA\\CIRCUITS\\AUSTRIA\\2003RH_A-1_RING\\2003RH_A-1_RING
TotalNumLaps=372
BestLapTime=67.841919

Her skal jeg ha værdien af TrackName, TotalNumLaps og BestLapTime, for hver enkelt track. Eksemplet viser data for to tracks.



24 svar postet i denne tråd vises herunder
2 indlæg har modtaget i alt 4 karma
Sorter efter stemmer Sorter efter dato
User
Bruger #52 @ 02.01.04 21:47
Så har jeg strikket noget kode sammen, som der læser den slags ini fil som du sendte mig på mail, det er _lidt_ indviklet, hvis man ikke ved hvad det gør.. så bare nøjes med at bruge de 2 funktioner jeg har lavet.... Set nedenstående kode ind i et php dokument, så burde du se hvordan det nogenlunde fungere...

<?php
function parse_race_file($f) {
$fp = fopen($f,r);
$res = fread($fp,filesize($f));
$res = substr($res,strpos($res,"[PLAYERTRACKSTAT]"),strlen($res));
$res = explode("[PLAYERTRACKSTAT]",trim($res));
while(list($key,$val) = each($res)) {
if (trim($val) != "") {
if (is_array($a)) {
$a = array_merge($a,parse_section($val));
}else{
$a = parse_section($val);
}
}
}
fclose($fp);
return $a;
}
function parse_section($s) {
$s = explode("\\n",trim($s));
while(list($key,$val) = each($s)) {
$tmp = explode("=",trim($val));
if ($tmp[0] == "TrackName" && empty($TrackName)) {
$TrackName = $tmp[1];
}else{
$a[$TrackName][$tmp[0]] = $tmp[1];
}
}
return $a;
}



$result = parse_race_file("blah.ini");
print_r($result);
?>
</pre>


--
Med Venlig Hilsen
Lasse Hjorth
@CyboFuto at irc #udvikleren.dk




Lige en lille huritg...

Er der en anden funktion end round() til at fjerne decimaler med?

Grunden er at jeg skal fjerne decimalerne uden at jeg risikerer at der bliver rundet op.


$tal = number_format ($tal, 0);

--
Ronni Egeriis - http://sqdev.dk/
Co-Admin



Jeg skal ha lidt hjælp til at trække nogle data ud af en fil.

Jeg har fået styr på at få fat i filen og skrive indholdet af den ud.

Det jeg skal ha hjælp til er hvordan jeg løber filen igennem og får hevet enhelte værdier ud fra den efter nogle "søge" ord.

Lidt data fra selve filen:
[CAREER]
AbortedSeasons=0
TotalLaps=1186
TotalRaces=38
TotalRacesWithAI=30
m.m.

Det første jeg skal ha hevet ud er værdien af TotalLaps.

Lidt længere nede i filen står der følgende:
[PLAYERTRACKSTAT]
TrackName=2003RH_ALBERT_PARK
TrackFile=SEASONDATA\\CIRCUITS\\AUSTRALIA\\2003RH_ALBERT_PARK\\2003RH_ALBERT_PARK
TotalNumLaps=1
BestLapTime=0.000000
[PLAYERTRACKSTAT]
TrackName=2003RH_A-1_RING
TrackFile=SEASONDATA\\CIRCUITS\\AUSTRIA\\2003RH_A-1_RING\\2003RH_A-1_RING
TotalNumLaps=372
BestLapTime=67.841919

Her skal jeg ha værdien af TrackName, TotalNumLaps og BestLapTime, for hver enkelt track. Eksemplet viser data for to tracks.


Hvorfor ikke putte det hele i en database?
MxS @ http://mxs.frac.dk
Slamkodning for fred



Ja, jeg bruger normalt altid database og ved derfor ikke så meget om hvordan det der fil halløj virker, men nu ligger det sådan at de data jeg skal ha fat i bliver genereret af et spil (F1 Challenge for dem som vil vide det)

Nå, men jeg er nu også kommet rimelig langt med det hele takket være lidt start hjælp til hvordan man finder bestemte org i filen og arbejder videre med dem.

Men nu sidder jeg fast igen.

Mit problem er at der i filen er værdier, om man vil, som har samme variabel navn :-)

Det betyder jo så at jeg ender ud med den første værdi for det variabel navn jeg søger på.

Hvis jeg ikke tager meget fejl, så er jeg vel nødtil at oprette noget array lignende noget for at få gemt de værdier jeg vil ha fat i, eller er der noget til filer der virker på samme måde som while ($row = mysql_fetch_array($res)) {


De data jeg vil fange hedder TrackName, TotalNumLaps og BestLapTime. (se min første post for mere)

I selve filen står de tre navne en 11-12 gange så jeg skal jo ha dem fanget og lang et sted hvor jeg kan arbejde videre med dem, uden at rækkefølgen på dem bliver blandet sammen.



Kig på denne class, den kan læse ini filer:

http://codewalkers.com/getcode.php?id=138


--
Ronni Egeriis - http://sqdev.dk/
Co-Admin



Lige en lille huritg...

Er der en anden funktion end round() til at fjerne decimaler med?

Grunden er at jeg skal fjerne decimalerne uden at jeg risikerer at der bliver rundet op.



Jeg fik et hint om funktionen flood() som jeg har brugt... Den virker helt fint. Ellers tak.

Den guide du linkede til kunne jeg ikke lige finde rundt i.

Jeg har følgende nu, og mangler kun at få det med gennemløb af [PLAYERTRACKSTAT] til at virke.

Data ex fra filen:
[PLAYERTRACKSTAT]
TrackName=2003RH_BARCELONA
TrackFile=SEASONDATA\\CIRCUITS\\SPAIN\\2003RH_BARCELONA\\2003RH_BARCELONA
TotalNumLaps=159
BestLapTime=80.355225
[PLAYERTRACKSTAT]
TrackName=2003RH_IMOLA
TrackFile=SEASONDATA\\CIRCUITS\\SAN_MARINO\\2003RH_IMOLA\\2003RH_IMOLA
TotalNumLaps=350
BestLapTime=82.993408


Lidt af min kode:
function txtsoeg($ord, $fil) {
$fp = fopen($fil, r);
if($fp) {
$filArray = file($fil);
$do = implode("", $filArray);
fclose($fp);
}
$soeg = explode("$ord=", $do);
$soeg2 = explode("\\n", $soeg[1]);
return "$soeg2[0]";
}


$rep = "laptimes/";
$dir = opendir($rep);

while ($f = readdir($dir)) {
if(is_file($rep.$f)) {

$totalLaps = txtsoeg('TotalLaps', $rep.$f);
$trackName = txtsoeg('TrackName', $rep.$f);
$totalNumLaps = txtsoeg('TotalNumLaps', $rep.$f);
$bestLapTime = txtsoeg('BestLapTime', $rep.$f);

Noget html kode.
De følgende tre linjer skal gentages med hver "bane" i filen

<? echo $trackName ?>
<? echo $totalNumLaps ?>
<? echo $bestLapTime ?>




Så nemt er det:

Fold kodeboks ind/udKode 


Så skal du blot inkludere det kode jeg linkede til, fra filen class.ini.php - eller hvad du har lyst til at kalde den.


Men der er dog den ulempe at det ikke virker helt i lige netop dit tilfælde, da der er to sections af samme navn.


--
Ronni Egeriis - http://sqdev.dk/
Co-Admin



HEHE... Ja, så kan det jo være nok så nemt... Det hjælper jo ikke meget hvis det ikke virker i mit tilfælde. :-/

Er jeg helt forkert på den når jeg forestiller mig at jeg skal ha laver følgende.

Et array for hver at de tre data som jeg vil fange. Altså et til
TrackName, TotalNumLaps og et til BestLapTime

Så burde de indsamlede data vel bliver lagt i samme rækkefølge i hver deres array, og derefter kan jeg vel bare spytte dem ud.

Men hvordan gør jeg lige det, og hvordan får jeg fyldt mit array. Jeg syntes ikke lige jeg kan få det til at funke. /me savner databaser :-(



Den her kode finder den første forekomst af ordet $ord og sender den efterfølgende værdi tilbage.

Fold kodeboks ind/udKode 


Hvordan får jeg den til at fortsætte sådan at den fortsætter med at søger videre efter $ord indtil den er nået til enden.

Værdien af hver forekomst der er fundet af $ord skal så sendes tilbage som resultat.



<< < 123 > >>
t