Avatar billede sorenriis Nybegynder
22. januar 2005 - 22:26 Der er 18 kommentarer og
1 løsning

PHP: Læse txt-filer

Jeg er ved at lave et script (eller ihvertfald forsøge på det), som kan læse log-filer (txt-filer).

De kunne f.eks. se således ud:
-----

[Slot000]
Driver=Kører1
Vehicle=Ferrari 550 Maranello
Penalty=0
Place=1
Laps=24
BestLap=1:34.647
RaceTime=DNF
Reason=0

[Slot001]
Driver=Kører2
Vehicle=Lamborghini Murcielago R-GT
Penalty=0
Place=2
Laps=6
BestLap=1:35.450
RaceTime=DNF
Reason=0

----

Hvordan får jeg dem lettest læst ind i en mysql-database?
Har herunder forsøgt mig på at få dem skrevet ud (altså uden om mysql i første omgang).

<?
$filnavn="logfil.txt".

$url="logs/".$filnavn;
$cont = file_get_contents( $url );
$arr = preg_split( "/[Slot(.*)]/s", $cont );
unset( $arr[0] );
$arr = array_unique( $arr );
foreach ( $arr as $trackstat )
{
$lines = explode( " ", trim( $trackstat ) );
foreach ( $lines as $line )
{
$var = explode( "=", $line );
if ( count( $var ) == 2 )
{
$key = trim( $var[0] );
$val = trim( $var[1] );
// Slet echo og gem i stedet i databasen...
echo "$key = $val<br>";
}
}
}
?>

Det er hvad jeg har rodet mig frem til indtil videre...

Men jeg kan bare ikke få det til at virke. Det jeg skal er at behandle hver blok (f.eks. [Slot000]), således at det er muligt at sende den til en mysql-database.
Hvad er det lige jeg gør galt?

Hvis I vil se hvordan logfilen "rigtigt" ser ud, så ligger der en her:
http://www.riisonline.dk/logfil.txt
Avatar billede Slettet bruger
22. januar 2005 - 22:28 #1
skal du bare have alt indholdet ind i en række?
Avatar billede sorenriis Nybegynder
22. januar 2005 - 22:30 #2
Ja - alt indholdet af hver "blok" skal ind i en mysql-tabel.

En "blok" er, hvad jeg definerer sådan én her som:

[Slot001]
Driver=Kører2
Vehicle=Lamborghini Murcielago R-GT
Penalty=0
Place=2
Laps=6
BestLap=1:35.450
RaceTime=DNF
Reason=0
Avatar billede sorenriis Nybegynder
22. januar 2005 - 22:42 #3
Altså - hver "blok" skal ind i hver sin række i en mysql-tabel..
Avatar billede detox Nybegynder
22. januar 2005 - 23:26 #4
Jeg vil forsøge sådan her:

$ind = file_get_contents("logs/".$filnavn);
$match = preg_split("/\[Slot.*/", $ind);
array_shift($match);
foreach ($match as $key=>$val) {
    $lines = preg_split("/\n/", trim($val));
    $slot = sprintf("Slot%03u", $key);
    $query = "INSERT INTO tabel SET slot=$slot";
    foreach ($lines as $line) {
        list($name, $value) = preg_split("/=/", $line);
        $query .= ",$name=$value";
    }
    //mysql_query($query) or die(mysql_error()); // Indsæt i 'tabel'
    echo "$query<br /><br />";
}
Avatar billede detox Nybegynder
22. januar 2005 - 23:31 #5
evt.:

$query .= ",$name=".trim($value);
Avatar billede sorenriis Nybegynder
22. januar 2005 - 23:46 #6
Tror jeg har formuleret mig lidt forkert. Det jeg vil have er et scrip der smider de data jeg skal bruge ind i en tabel, ala det her (forstil dig at det er en mysql-tabel): http://www.riisonline.dk/tabel.jpg

Man kan sikkert få dit scrip til at gøre det samme, men jeg kunne ikke lige gennemskue hvordan.

Mysql-query'en skal I ikke bekymre jer om - den har jeg helt styr på...
Avatar billede sorenriis Nybegynder
22. januar 2005 - 23:49 #7
Alle de "Lap=(x, xxx.xxx, x:xx.x)" vil jeg iøvrigt gerne have fjernet - dem skal jeg ikke bruge til noget, men det skal jeg med alt det andet..
Avatar billede detox Nybegynder
22. januar 2005 - 23:58 #8
Jamen det var osse meningen med scriptet. Du skal jo bare rette tabelnavnet og feltnavnene i din tabel, det er det letteste. Men hvis det skal ind i den specifikke tabel skal det lige rettes lidt til (og så er der jo flere data der skal smides væk).
Avatar billede detox Nybegynder
23. januar 2005 - 00:03 #9
Jeg kan bare ikke se at 'BestLap' er en del af dataene i filen?
Avatar billede sorenriis Nybegynder
23. januar 2005 - 00:05 #10
Det er den... se post#1...
Det skyldes at den ikke altid er med - derfor røg den ikke med i logfilen jeg linkede til..
Avatar billede detox Nybegynder
23. januar 2005 - 00:08 #11
Så må det blive i den her stil:

$ind = file_get_contents("logs/".$filnavn);
$match = preg_split("/\[Slot.*/", $ind);
array_shift($match);
foreach ($match as $key=>$val) {
    $lines = split("\n", trim($val));
    foreach ($lines as $line) {
        list($name, $value[]) = split("=", $line);
       
    }
    $query = "INSERT INTO tabel VALUES ('$value[0]','$value[1]','$value[3]','$value[4]','$value[5]')";
    //mysql_query($query) or die(mysql_error()); // Indsæt i 'tabel'
    echo "$query<br /><br />";
}
Avatar billede sorenriis Nybegynder
23. januar 2005 - 00:11 #12
Takker...
Men tilsyneladende tager den kun den første "blok" og så genbruger den bare den:

Resultatet af at køre det script var:
INSERT INTO tabel VALUES ('Claus Juel','CeeJay','0','1','24')

INSERT INTO tabel VALUES ('Claus Juel','CeeJay','0','1','24')

Noget du lige gider at kigge på også?
Avatar billede detox Nybegynder
23. januar 2005 - 00:14 #13
Ja, der mangler lige en unset() og så har jeg tilføjet en trim() mere:

$ind = file_get_contents("logs/".$filnavn);
$match = preg_split("/\[Slot.*/", $ind);
array_shift($match);
foreach ($match as $val) {
    $lines = split("\n", trim($val));
    foreach ($lines as $line) {
        list($name, $val) = split("=", $line);
        $value[] = trim($val);
    }
    $query = "INSERT INTO tabel VALUES ('$value[0]','$value[1]','$value[3]','$value[4]','$value[5]')";
    unset($value);
    //mysql_query($query) or die(mysql_error()); // Indsæt i 'tabel'
Avatar billede detox Nybegynder
23. januar 2005 - 00:17 #14
list($name, $val) = split("=", $line);
        $value[] = trim($val);

kunne selvfølgelig osse bare være:

        $arr = split("=", $line);
        $value[] = trim($arr[1]);
Avatar billede sorenriis Nybegynder
23. januar 2005 - 00:21 #15
Ok..  mange tak..

Har du testet scriptet? Jeg kan ikke lige få det til at virke nu...
Avatar billede detox Nybegynder
23. januar 2005 - 00:25 #16
Ja, det virker fint her. Hvad går der galt hos dig, nogen fejlmelding?
Avatar billede sorenriis Nybegynder
23. januar 2005 - 00:27 #17
Der sker intet - blank side når det køres simpelthen...
Avatar billede sorenriis Nybegynder
23. januar 2005 - 00:28 #18
fandt fejlen.. havde en fejl i det script der finder filnavnet..
Avatar billede detox Nybegynder
23. januar 2005 - 00:28 #19
Arh, ok der mangler echo linjen.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester