CSV-String in Array umwandeln

DaRealMC

Erfahrenes Mitglied
Hallo zusammen,

ich sitze gerade an einem Progrämmchen, das mir Logfiles auswertet und bestimmte Alerts gibt.
Das ganze mit PHP und einer externen Applikation Namens LogParser 2.2 von Microsoft.

Das Aufrufen von Logparser klappt und ich bekomme ein Ergebnis zurück.
Code:
09:30:00,109,xx.xx.4.107
09:30:00,177,xx.xx.11.132
09:30:00,246,xx.xx.252.206
09:30:00,119,xx.xx.140.96
09:30:00,144,xx.xx.75.165
09:30:00,113,xx.xx.205.177
09:30:00,201,xx.xx.113.21
09:30:00,172,xx.xx.73.155

Die Frage ist jetzt nur, wie bekomme ich das in in Array? Für PHP ist das ein einziger String.

PHP:
$csv=array(list($zeit, $hits, $ip) = explode(',',(system('"logparser" "select QUANTIZE(time, 900) AS Stunden, count(*) as Hits, c-ip from '.$logfiles .' where time >= \'09:00:00\' and time < \'11:52:00\' group by Stunden, c-ip having hits > 100 order by Stunden" -stats:off -q:on -i:IISW3C -o:csv'))));
print_r ($csv);
Dieser Code gibt mir leider nur die letzte Zeile ins Array.

Interessant ist aber, dass wenn ich gleich den String da oben an explode() übergebe, geht es.
Nun habe ich versucht, per str_replace \r oder \n durch \r\n zu ersetzen, aber beides war nicht die richtige Idee.

Hat jemand eine Idee, wie ich diesen String in ein Array bekomme?
 
Wie sieht das Resultat von dem folgenden aus? Ein Array. Eine Resource, Ein String, mehrere Strings?
Code:
(system('"logparser" "select QUANTIZE(time, 900) AS Stunden, count(*) as Hits, c-ip from '.$logfiles .' where time >= \'09:00:00\' and time < \'11:52:00\' group by Stunden, c-ip having hits > 100 order by Stunden" -stats:off -q:on -i:IISW3C -o:csv')))

Hab grad keine Lust im www zu suchen....

Um Fehler zu suchen lohnt es sich eine solche Befehlskette auf mehrere Zeilen aufzuteilen. So kann man debuggen und erkennt ev. wwas das ganze machen sollte.
 
gettype() sagt string

//edit: hmm....
Es sind mehrere strings.
Für jede Zeile einer.
echo $ergebnis; bringt mir nämlich auch nur die letzte Zeile.
 
Zuletzt bearbeitet:
Führ mal die folgende Zeile aus und poste das Resultat, damit man auch sieht in welchem Format das Zeug da rauskommt.
Dann können wir mal schauen was dein Restlciher Code macht

PHP:
$res = system('"logparser" "select QUANTIZE(time, 900) AS Stunden, count(*) as Hits, c-ip from '.$logfiles .' where time >= \'09:00:00\' and time < \'11:52:00\' group by Stunden, c-ip having hits > 100 order by Stunden" -stats:off -q:on -i:IISW3C -o:csv')
var_dump($res);
 
Hab mich mal über system() schlau gemacht. Und ich glaube da steht auch deine Antwort

Beschreibung
string system ( string $command [, int &$return_var ] )
Die Funktion system() ähnelt der C Version der Funktion sehr, indem es einen übergebenen Befehl ausführt und dessen Ausgabe anzeigt.

Wird ein system()-Funktionsaufruf durchgeführt, versucht die Funktion automatisch, nach jeder Ausgabezeile den Ausgabepuffer zu flushen, sofern PHP als Servermodul läuft.

Wenn Sie einen Befehl ausführen wollen und die erzeugten Daten ohne Behinderung direkt zurückgeben wollen, verwenden Sie stattdessen die Funktion passthru().

http://ch2.php.net/manual/de/function.system.php
 
09:30:00,109,xx.xx.4.107
09:30:00,177,xx.xx.11.132
09:30:00,246,xx.xx.252.206
09:30:00,119,xx.xx.140.96
09:30:00,144,xx.xx.75.165
09:30:00,113,xx.xx.205.177
09:30:00,201,xx.xx.113.21
09:30:00,172,xx.xx.73.155
11:45:00,420,xx.xx.3.242
string(25) "11:45:00,420,xx.xx.3.242"

Der kreigt also für jede Zeile einen eigenen String. Die Frage ist nur, wie kann ich auf die vorherigen Strings zugreifen, die werden ja alle mit einem befehl rausgehauen.


edit//
Mit passthru() gehts aber auch nicht.

PHP:
$ergebnis=(passthru('"d:\\programme\\log parser 2.2\\logparser" "select QUANTIZE(time, 900) AS Stunden, count(*) as Hits, c-ip from '.$logfiles .' where time >= \'13:00:00\' and time < \'13:52:00\' group by date, Stunden, c-ip having hits > 150 order by Stunden" -stats:off -q:on -i:IISW3C -o:csv'));
//echo "====$ergebnis===";
//$ergebnis=str_replace('\n','\r\n',$ergebnis);

$csv=array(list($zeit, $hits, $ip) = explode(',',$ergebnis));

print_r ($csv);
Code:
Stunden,Hits,c-ip
13:00:00,179,xx.xx.41.77
13:00:00,157,xx.xx.196.85
13:00:00,167,unknown
13:00:00,178,xx.xx.0.1
13:15:00,161,xx.xx.159.99
13:15:00,180,xx.xx.41.77
13:15:00,254,xx.xx.0.1
13:30:00,180,xx.xx.41.77
13:30:00,440,xx.xx.249.93
13:30:00,261,xx.xx.159.99
13:30:00,178,127.0.0.1
13:45:00,169,127.0.0.1
Array
(
    [0] => Array
        (
            [0] => 
        )

)
 
Zuletzt bearbeitet:
Also ein String mit Zeilenumbruch und Kommas.

Gut. Dein explode nimmt alles und trennt bei ','. Das gibt schon mal nix sinnvolles.
Wzu du dann diese mit list den Variablen zuordnest um gleich einen Array mit den Variableninhalten machen willst, begreiffe ich nicht.

Hab das ganze mal simuliert
PHP:
<?php 
$ergebnis = 'Stunden,Hits,c-ip
13:00:00,179,xx.xx.41.77
13:00:00,157,xx.xx.196.85
13:00:00,167,unknown
13:00:00,178,xx.xx.0.1
13:15:00,161,xx.xx.159.99
13:15:00,180,xx.xx.41.77
13:15:00,254,xx.xx.0.1
13:30:00,180,xx.xx.41.77
13:30:00,440,xx.xx.249.93
13:30:00,261,xx.xx.159.99
13:30:00,178,127.0.0.1
13:45:00,169,127.0.0.1';

$rows = explode("\n", $ergebnis);

//erstes Element (Titelziele) entfernen
$headerstring = array_shift($rows);

foreach($rows as $row){
    $table[] = explode(',', $row);
}

var_dump($table);

?>

Nachtrag
Wenn du die Arrays mit den Feldern drinn mit namen ansteuern willst, kannst du den Array auch so aufbauen
PHP:
...
$headerstring = array_shift($rows);
$keys = array('stunden', 'hits', 'ip');

foreach($rows as $row){
    $table[] = array_combine($keys, explode(',', $row));
}
...
 
Zuletzt bearbeitet:
OK, deins und meins kombiniert bringt die Lösung:
PHP:
ob_start();
$ergebnis=(system('"d:\\programme\\log parser 2.2\\logparser" "select QUANTIZE(time, 900) AS Stunden, count(*) as Hits, c-ip from '.$logfiles .' where time >= \'13:00:00\' and time < \'13:52:00\' group by date, Stunden, c-ip having hits > 150 order by Stunden" -stats:off -q:on -i:IISW3C -o:csv'));
$ergebnis=ob_get_contents();
ob_end_clean();

$rows = explode("\r\n", $ergebnis);

//erstes Element (Titelziele) entfernen
$headerstring = array_shift($rows);

foreach($rows as $row){
    $table[] = explode(',', $row);
}

var_dump($table);

Code:
array(13) {
  [0]=>
  array(3) {
    [0]=>
    string(8) "13:00:00"
    [1]=>
    string(3) "179"
    [2]=>
    string(14) "xx.xx.41.77"
  }
  [1]=>
  array(3) {
    [0]=>
    string(8) "13:00:00"
    [1]=>
    string(3) "157"
    [2]=>
    string(14) "xx.xx.196.85"
  }
  [2]=>
  array(3) {
    [0]=>
    string(8) "13:00:00"
    [1]=>
    string(3) "167"
    [2]=>
    string(8) "unknown"
  }
  [3]=>
  array(3) {
    [0]=>
    string(8) "13:00:00"
    [1]=>
    string(3) "178"
    [2]=>
    string(10) "127.0.0.1"
 }
[...]

Danke :)
 
Zuletzt bearbeitet:
Zurück