Avatar billede firestone Nybegynder
28. februar 2008 - 18:39 Der er 20 kommentarer og
1 løsning

Regex udlæsning af linier fra tekstfil til variabler i php

Jeg har en logfil med mange linier data er som følger

2007.02.28-INCIDENT_MATCHING_STRING-ERR [ AON: 1 BON: 1 CONS: 11 DON: 12MB ] [INFO: email.send.to.admin ]

dvs alle linier følger dette format, jeg vil så udlæse hvert af disse elementer med hver sin regex sætning, men jeg fatter det ikke lige helt meningen er at jeg skal have dem ind i en mysql database, men startede med bare at prøve at matche de 7 dele:
dato/errormsg/AON/BON/CONS/DON og så INFO. ved AON/BON/CONS/INFO er det kun værdierne jeg skal bruge.

En der har en idee?
Avatar billede nielle Nybegynder
28. februar 2008 - 18:46 #1
Dette mønster burde kunne gøre det:

(.*?)-(.*?)\[ AON: (.*?) BON: (.*?) CONS: (.*?) DON: (.*?) \] \[INFO: (.*?) \]
Avatar billede firestone Nybegynder
28. februar 2008 - 18:52 #2
Jeg vil gerne kunne:

date = "regex blabla"; // så er det kun datoen som er i den variabel
incident = "regex blabla"; // så er det INCIDENT_MATCHING_STRING-ERR som er i den.
AON = "regex blabla"; // så er det værdien 1 som er i den.
og sådan fremdeles? er det muligt
Avatar billede nielle Nybegynder
28. februar 2008 - 18:56 #3
Ja da, men siden at du ikke har fortalt noget om hvilket programmeringssprog du skal lave det i så kan jeg ikke vise dig hvordan...
Avatar billede firestone Nybegynder
28. februar 2008 - 18:59 #4
har kun fået skrevet det i overskriften, sorry det er php jeg skal bruge..
Avatar billede nielle Nybegynder
28. februar 2008 - 19:08 #5
Gættede det nu også ud fra dine andre spørgsmål ;^)

Men det er *aktid* vigtigt at specificere hvilket sprog det skal laves i. Selve regex'en er (som regel) den samme, men resten er der himmelvid forskel på...

Et bud:

$indData = "blah-blah_blah";

$pattern = "(.*?)-(.*?)\[ AON: (.*?) BON: (.*?) CONS: (.*?) DON: (.*?) \] \[INFO: (.*?) \]";
$phpPattern = "/$pattern/";

preg_match_all($php_Pattern, $indData, $matches);

$noOfCaptures = count($matches[0]);
for ($capture = 0; $capture < $noOfCaptures; $capture++) {
    $date    = $matches[1][$capture];
    $incident = $matches[2][$capture];
    $AON      = $matches[3][$capture];
    $BON      = $matches[4][$capture];
    $CONS    = $matches[5][$capture];
    $DON      = $matches[6][$capture];
    $INFO    = $matches[7][$capture];
}


Hvis du ellers er interesseret:

Jeg har i øvrigt skevet 4 artikler her på E. Den 3. af dem viser faktisk ovenstående fremgangsmåde:

http://www.eksperten.dk/artikler/1156
http://www.eksperten.dk/artikler/1157
http://www.eksperten.dk/artikler/1160
http://www.eksperten.dk/artikler/1162
Avatar billede firestone Nybegynder
28. februar 2008 - 19:24 #6
burde en echo $date; så ikke give mig en dato, hvis jeg i $indData = "2007.02.28-INCIDENT_MATCHING_STRING-ERR [ AON: 1 BON: 1 CONS: 11 DON: 12MB ] [INFO: email.send.to.admin ]"  ?
Avatar billede nielle Nybegynder
28. februar 2008 - 19:28 #7
Jo det burde den, men siden at du spørger så gætter jeg på at den ikke gør det?
Avatar billede firestone Nybegynder
28. februar 2008 - 19:37 #8
En var_dump på
var_dump($date);
var_dump($incident);
var_dump($AON);
giver NULL NULL NULL

$noOfCaptures = count($matches[0]);
for ($capture = 0; $capture < $noOfCaptures; $capture++) {
    $date    = $matches[1][$capture];
    $incident = $matches[2][$capture];
    $AON      = $matches[3][$capture];
    $BON      = $matches[4][$capture];
    $CONS    = $matches[5][$capture];
    $DON      = $matches[6][$capture];
    $INFO    = $matches[7][$capture];
var_dump($date);
var_dump($incident);
var_dump($AON);

}

echo $date;
echo $incident;
Avatar billede nielle Nybegynder
28. februar 2008 - 19:41 #9
Prøv heller en dump på $matches.
Avatar billede nielle Nybegynder
28. februar 2008 - 19:48 #10
Ups, ret lige:

preg_match_all($php_Pattern, $indData, $matches);

til:

preg_match_all($phpPattern, $indData, $matches);
Avatar billede firestone Nybegynder
28. februar 2008 - 20:17 #11
<?PHP
$indData = "2007.02.28-INCIDENT_MATCHING_STRING-ERR [ AON: 1 BON: 1 CONS: 11 DON: 12MB ] [INFO: email.se
nd.to.admin ]";
$pattern = "(.*?)-(.*?)\[ AON: (.*?) BON: (.*?) CONS: (.*?) DON: (.*?) \] \[INFO: (.*?) \]";
$phpPattern = "/$pattern/";
preg_match_all($phpPattern, $indData, $matches);
$noOfCaptures = count($matches[0]);
for ($capture = 0; $capture < $noOfCaptures; $capture++) {
    $date    = $matches[1][$capture];
    $incident = $matches[2][$capture];
    $AON      = $matches[3][$capture];
    $BON      = $matches[4][$capture];
    $CONS    = $matches[5][$capture];
    $DON      = $matches[6][$capture];
    $INFO    = $matches[7][$capture];
var_dump($AON);
var_dump($phpPattern, $indData, $matches);
}
echo $date . '<br>';
echo $incident . '<br>';
echo $AON . '<br>';
echo $BON . '<br>';
echo $CONS . ' <br>';
echo $DON . '<br>';
echo $INFO . '<br>;
?>

giver resultatet:

2007.02.28
INCIDENT_MATCHING_STRING-ERR

og ikke mere hm undre mig lidt, om jeg gør noget forkert
Avatar billede nielle Nybegynder
28. februar 2008 - 20:20 #12
Du kan jo lige starte med at reducere antallet af udskrifter, eller i det mindste gøre sådan at man kan skelne imellem dem. Jeg kan ikke lige se hvilke af dem der er ansvarligt for de to udskrevne linjer. :^)
Avatar billede firestone Nybegynder
28. februar 2008 - 20:26 #13
en ting jeg har lagt mærke til, er at der hvor den går galt er lige hvor den brækker 2007.02.28-INCIDENT_MATCHING_STRING-ERR fra resten.. Ser ud til den ikke rammer [AON:.* delen og resten.. sidder og prøver lidt online på noget regex test :)
Avatar billede nielle Nybegynder
28. februar 2008 - 20:42 #14
Prøv med:

<?PHP
$indData = "2007.02.28-INCIDENT_MATCHING_STRING-ERR [ AON: 1 BON: 1 CONS: 11 DON: 12MB ] [INFO: email.send.to.admin ]";
$pattern = "(.*?)-(.*?) \[ AON: (.*?) BON: (.*?) CONS: (.*?) DON: (.*?) \] \[INFO: (.*?) \]";
$phpPattern = "/$pattern/";

preg_match_all($phpPattern, $indData, $matches);
var_dump($matches);

$noOfCaptures = count($matches[0]);
for ($capture = 0; $capture < $noOfCaptures; $capture++) {
    $date    = $matches[1][$capture];
    $incident = $matches[2][$capture];
    $AON      = $matches[3][$capture];
    $BON      = $matches[4][$capture];
    $CONS    = $matches[5][$capture];
    $DON      = $matches[6][$capture];
    $INFO    = $matches[7][$capture];
    // var_dump($AON);
    // var_dump($phpPattern, $indData, $matches);
}

// echo $date . '<br>';
// echo $incident . '<br>';
// echo $AON . '<br>';
// echo $BON . '<br>';
// echo $CONS . ' <br>';
// echo $DON . '<br>';
// echo $INFO . '<br>;
?>


... og så bagefter med:

$pattern = '(.*?)-(.*?) \[ AON: (.*?) BON: (.*?) CONS: (.*?) DON: (.*?) \] \[INFO: (.*?) \]';
Avatar billede firestone Nybegynder
28. februar 2008 - 20:47 #15
efter en del test frem og tilbage så har jeg fundet ud af det er INFO delen som ikke fungere :) og kun den..
Avatar billede nielle Nybegynder
28. februar 2008 - 20:59 #16
Jeg kan ikke rigtig se at den skulle fejle på nogen måde - specielt ikek da de andre ikke gør det.

Det er i een linje eller hvad?
Avatar billede firestone Nybegynder
28. februar 2008 - 22:20 #17
fik det til at fungere, rigtig mange tak for hjælpen :) De points er dig meget velfortjent
Avatar billede firestone Nybegynder
28. februar 2008 - 22:21 #18
giv mig lige et svar dimmer :) SÅ får du dem her
Avatar billede nielle Nybegynder
28. februar 2008 - 22:32 #19
Hvordan kom løsningen til at se ud?
Avatar billede firestone Nybegynder
28. februar 2008 - 22:49 #20
som du skrev, jeg havde bare glemt et tegn haha ;) hurra for apache error log: se oven over // echo $INFO . '<br>; <- mangler der ikke lige ' hehe
Avatar billede firestone Nybegynder
28. februar 2008 - 22:50 #21
ie havde så cachet nogen af gangene, så bliver det jo lidt tricky hehe
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
Kurser inden for grundlæggende programmering

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

IT-JOB

Forsvarsministeriets Materiel- og Indkøbsstyrelse

Ingeniør til Satellitkommunikation

AL Sydbank A/S (tidligere Arbejdernes Landsbank)

Tech Lead til Datacenter Operations

Forsvarsministeriets Materiel- og Indkøbsstyrelse

Nye kolleger søges til IT Stab i Forsvaret