Datei auslesen und Inhalt verarbeiten.

Crazy_down

Erfahrenes Mitglied
Hi, ich möchte eine Datei auslesen und den Inhalt daraus verarbeiten.
Das Problem dabei: Den Text in der Datei zu trennen.
Der Inhalt baut sich wie folg auf:
Code:
PlayerID=17e16a1c02d714a560abb8cbxxxxxxxx (Last Login: 2006/05/1)Testserver;Name1;Name2

Jetzt bin ich soweit das die Datei geöffnet und der Inhalt Zeilenweise ausgegeben wird.
Ich möchte die Zeile aber noch weiter auseinander nehmen.
Und zwar so:
PlayerID= : entfällt.
17e16a1c02d714a560abb8cbxxxxxxxx : wird ausgegeben
(Last Login: entfällt.
2006/05/1 : wird ausgegeben
Testserver : wird ausgegeben
Name1;Name2: wird ausgegeben

So ich hoffe das ist einiger Maßen verständlich.
Ich wollte jetzt mit Explode(), daran gehen und den String auseinander nehmen aber ich kann soweit ich weiß nur ein Zeichen angeben nachdem es suchen soll, oder ?

z.b.
PHP:
explode("=", $string);
Damit würde ich schonmal bis hinter das PlayerID= kommen.
Aber wie gehts dann weiter ? Ich hoffe ihr könnt mir Helfen.


P.S. ich muss auch nochmal auf diesen Thread verweisen ;) Komme da auch nicht wirklich weiter und will ihn nicht wieder Hoch pushen. Danke.
http://www.tutorials.de/forum/php/275480-zaehlerstand-bei-behalten.html


danke schonmal
crazy_down
 
^^ Hab ich schon die ganze Zeit offen diese Seite ;)

Aber ich glaube ich habe es Falsch erklärt.
Mit
PHP:
explode("=", $string);
Komme ich bis hinter PlayerID=
dann soll es sozusagen zu
PHP:
explode(" ", $string);
werden damit ich bis hinter
17e16a1c02d714a560abb8cbxxxxxxxx komme und diesen String soll er ausgeben.
Dann soll
PHP:
explode(")", $string);
Damit ich hinter das datum komme usw.

Das meinte ich. Wie kann ich mehrere trennzeichen für die reihenfolge angeben ?
 
PHP:
<?php
  function getPlayerID($splitFirst,$splitSecond,$source){
    $removeFirst = explode($splitFirst, $source);
    $removeSecond = explode($splitSecond, $removeFirst[1]);
    return $removeSecond[0];
  }

  
  $source = 'PlayerID=17e16a1c02d714a560abb8cbxxxxxxxx (Last Login: 2006/05/1)Testserver;Name1;Name2';
  $splitFirst = '=';
  $splitSecond = ' ';

  $playerID = getPlayerID($splitFirst,$splitSecond,$source);
?>

So in etwa sollte es laufen.
(Zwar nicht so schoen, aber t [theoretisch, falls ich mich nicht vertan habe]. Kannste es ja noch verfeinern/debuggen..)

mfg
Suche
 
Ehm fast ;)
Nur verstehe ich das nicht ganz
$splitFirst = '=';
$splitSecond = ' ';

Geben doch an wonach getrennt werden soll ?
Er nimmt den String ab dem "=" und bis zum " ".
Soll aber ab dem = und wieder ab dem " " usw.


 
OK ich habe dein Script etwas Umgebaut und es Funktioniert soweit.
Es sieht nun so hier aus:
PHP:
<?php
//----------- Beispiel vom Inhalt der Shortlog.ini ---------------------
// PlayerID=17e16a1c02d714a560abb8cbxxxxxxxx (Last Login: 2006/05/1)Cool Paxytestserver;Paxy1;Paxy2

//Datei Öffnen mit Fopen()
$nicks = fopen('shortlog.ini','r');
// Funktion getPlayerID
function getPlayerID($splitFirst,$splitSecond,$source){
    $removeFirst = explode($splitFirst, $source);
    $removeSecond = explode($splitSecond, $removeFirst[1]);
    return $removeSecond[0];
  }
  $splitFirst = '=';
  $splitSecond = ' ';

//-----------Funktionsende getPlayerID ----------------

//Funktion LastLogin
function getLastLogin($splitdatum,$splitdatumEnde,$source)
{
    $removeFirst = explode($splitdatum, $source);
    $removeSecond = explode($splitdatumEnde, $removeFirst[1]);
    return $removeSecond[0];
}
$splitdatum = ':';
$splitdatumEnde = ')';
//---------Funktionsende getLastLogin--------------------

//Funktion getServer
function getServer($splitServer,$splitServerEnde,$source)
{
    $removeFirst = explode($splitServer, $source);
    $removeSecond = explode($splitServerEnde, $removeFirst[1]);
    return $removeSecond[0];
}
$splitServer = ')';
$splitServerEnde = ';';
//---------Funktionsende getServer--------------------

//Funktion getNicks
function getNicks($splitNicks,$splitNicksEnde,$source)
{
    $removeFirst = explode($splitNicks, $source);
    $removeSecond = explode($splitNicksEnde, $removeFirst[1]);
    return $removeSecond[0];
}
$splitNicks = ';';
$splitNicksEnde = ' ';


//---------Funktionsende getNicks--------------------

// Inhalt der Datei Zeilenweise Einlesen und Verarbeiten.
while (!feof($nicks))
{
     $zeile = fgets($nicks,filesize('shortlog.ini'));
          $source = $zeile;
          $playerID = getPlayerID($splitFirst,$splitSecond,$source);
     $playerlogin = getLastLogin($splitdatum,$splitdatumEnde,$source);
          $Server = getServer($splitServer,$splitServerEnde,$source);
          $Nicks = getNicks($splitNicks,$splitNicksEnde,$source);
       echo "<br>".$playerID,$playerlogin,$Server,$Nicks;




}
// ------------Ende der WHILE-Schleife


$size=filesize("shortlog.ini");
$size=$size/1000;
echo "<br><br>".$size."kb";


   $ip = $_SERVER['REMOTE_ADDR'];
   $host = gethostbyaddr($ip);
   echo "<br>IP-Adresse: $ip<br>";
   echo "Hostname: $host";


// verbindung Schließen um Serverlast zu Reduzieren
fclose($nicks);



?>

Eine etwas Unsaubere Lösung, aber es geht.

Nur ein Problem habe ich noch.
Das Ergebniss sieh so aus.
Code:
17e16a1c02d714a560abb8cbxxxxxxxx 2006/05/1Cool TestserverNick1
17e16a1c02d714a560bbb8cbxxxxxxxy 2006/05/1Cool blablaserverBla
57ad568af5062fb47e54325c651ce65b 2007/05/20Gamers_serverName1

Da hinter dem ersten Namen wieder ein ";" kommt, geht er direkt zur 2. Zeile ohne die anderen Namen mit aufzulisten.
Ich müsste also noch weiter machen bis die neue Zeile beginnt. Wir Realisiere ich das am besten ?

Danke
 
Da wo du die den ersten Namen rausholst, kannst du doch einfach ein ";" anfügen.
Ich hab mir dein Script nicht genau angeschaut, ob das nun in einer Funktion passiert oder wo auch immer :( Wäre dann bei einer Rückgabe aus einer Funktion sowas wie return $variable.";";

Andersrum habe ich mir mal deine Aufgabe geschnappt um mich mal wieder etwas mit Regular Expressions zu beschäftigen. Hilft dir jetzt nicht wirklich viel, aber mir hats geholfen (für die Erinnerung), wobei meine Lösung nicht wirklich "schön" ist.
Das war mein Ergebnis:

PHP:
$source[] = 'PlayerID=17e16a1c02d714a560abb8cbxxxxxxxx (Last Login: 2006/05/1)Cool Paxytestserver;Paxy1;Paxy2';
$source[] = 'PlayerID=17e16a1c02d714a560abb8cbxxxxxxxx (Last Login: 2006/05/1)Testserver;Name1;Name2';

FOREACH($source AS $src)
{
    preg_match('/^PlayerID=([a-zA-Z0-9]+)\s\(Last Login:\s(\d{4}\/\d{2}\/\d{1,2})\)([a-zA-Z0-9\s]+)\;([a-zA-Z0-9\s]+)\;([a-zA-Z0-9\s]+)$/', $src, $matches);
    # var_dump($matches); // Testausgabe
    $matches[0] = NULL;    // gesamtstring für nächsten schritt entfernen
    echo implode(' ', $matches);  // gibt alle Teile aus getrennt mit einem Leerzeichen
    echo("\n");
}

Wäre halt ein anderer weg.
 
Also deine 2. Lösung (mit Copy & Paste) funktionierte nicht =)
Kam ein Fehler wegen $source[].

Die erste Idee ist gut nur selbst nach dem Anfügen ließt er nicht danach weiter.

Und außerdem habe ich noch ein weiteres Problem festgestellt.
Ich will die Datensätze am ende in eine Datenbank eintragen und das sieht z.Z. so aus.

PHP:
while (!feof($nicks))
{
     $zeile = fgets($nicks,filesize('shortlog.ini'));
          $source = $zeile;
          $playerID = getPlayerID($splitFirst,$splitSecond,$source);
     $playerlogin = getLastLogin($splitdatum,$splitdatumEnde,$source);
          $Server = getServer($splitServer,$splitServerEnde,$source);
          $Nicks = getNicks($splitNicks,$splitNicksEnde,$source);
          $query="Insert into gamers values('','$playerID','$playerlogin','$Server','$Nicks')";
       echo "<br>".$playerID,$playerlogin,$Server,$Nicks;

}

Er trägt aber nur den letzten Datensatz ein. Liest es nicht eigentlich Zeilenweise in der While-Schleife ?
 
Ok mal dein Posting "abarbeiten".

"Da kam ein Fehler"... so könnte ich nicht helfen.
Mit dem anfügen, das habe ich wohl auch etwas falsch verstanden.

In deiner Funktion getNicks(); gibt es Rückgabewert $removeSecond[0], also nur ein Nick wird zurückgegeben. Und diese Funktion wird nur einmal aufgerufen, also kann da auch nur ein Nick zurückkommen.

Beispiel:
Die Überprüfst den String "hallo;eins;zwei" und hast eine Funktion wie deine getNicks() mit dem selben returnvalue.

echo einefunktionwiegetnicks("hallo;eins;zwei");

Dabei wird der String anhand des Semikolons und es ensteht das array mit den elementen 0=> hallo, 1=>eins, 2=> zwei, wobei deine Rückgabe nur [0] ist also "Hallo" (in diesem Beispiel). Daher macht deine Funktion genau das richtige.

Nun untersuchen wir die getNicks() funktion mal genauer.

Hier erstmal mein Beispiel mit dem ich getestet habe:

PHP:
function getNicks($splitNicks,$splitNicksEnde,$source)
{
    $removeFirst = explode($splitNicks, $source);
    var_dump($removeFirst);    // Siehe Punkt 1)
    $removeSecond = explode($splitNicksEnde, $removeFirst[1]);
    var_dump($removeSecond);    // Siehe Punkt 2)
    return $removeSecond[0];
}
$splitNicks = ';';
$splitNicksEnde = ' ';
echo("\n");
echo getNicks($splitNicks, $splitNicksEnde, 'PlayerID=17e16a1c02d714a560abb8cbxxxxxxxx (Last Login: 2006/05/1)Cool Paxytestserver;Paxy1;Paxy2');
echo("\n");
Code:
Punkt 1)
array(3) {
  [0]=>
  string(84) "PlayerID=17e16a1c02d714a560abb8cbxxxxxxxx (Last Login: 2006/05/1)Cool Paxytestserver"
  [1]=>
  string(5) "Paxy1"
  [2]=>
  string(5) "Paxy2"
}

// Punkt 2)
array(1) {
  [0]=>
  string(5) "Paxy1"
}
Punkt 1)
Dein String wird zuerst geteilt anhand von ;. Dabei entsteht ein array mit 3 Werten.
Von diesen 3 Werten nimmst du Part [1] und teilst den string anhand eines " " (leerzeichen). Sieht in diesem beispiel nicht sinnvoll aus, vielleicht gibt es da weitere Situationen, wo du das brauchst. Raus kommt natürlich nur ein array mit einem Element
Punkt 2)
Da bei dem zweiten explode in der Funktion nichts mit " " gefunden wurde, bleibt das Element nur bestehen.

Wenn du nun eine Rückgabe der Funktion in der Form von NICK1;NICK2 möchtest, sieht die Funktion dann wie folgt aus:

PHP:
function getNicks($splitNicks,$source)
{
    $removeFirst = explode($splitNicks, $source);
    return trim($removeFirst[1]).";".trim($removeFirst[2]);
}
Ich habe es nun nur mit diesem einen Teststring getestet, bei anderen Fällen kann natürlich es nicht stimmen. Ist halt sehr abhängig was du genau möchtest und von welcher Grundlage (Quelle) man ausgeht.


Zu deiner Frage mit dem SQL:

Es wird bei jedem Durchlauf der While Schleife der SQL String in $qeuery überschrieben. Nach Ende der WHILE Schleife wird dann der $qeueryausgeführt. Nun, da jedes mal der String überschrieben wird, bleibt am Ende nur der String vom letzten durchlauf der While Schleife.
 
Zuletzt bearbeitet:
So, ich Arbeite mich grade durch dein Bsp.
;) Vielen dank auf jeden Fall für die Mühe.
Aber nach dem ersten Blick glaube ich bekomme ich zuviele Informationen mit diesem Var_Dump ? Anscheinent gibt er mir ja alles aus was in der Variable steht.
Aber mal gucken :D

Also Grundlage ist sieht immer sohier aus.
Code:
PlayerID=17e16a1c02d714a560abb8cbxxxxxxxx (Last Login: 2006/05/1)Cool Testserver;Nick1;Nick2
PlayerID=17e16a1c02d714a560bbb8cbxxxxxxxy (Last Login: 2006/05/1)Cool blablaserver;Bla;Blub;BlubbLubb 
PlayerID=57ad568af5062fb47e54325c651ce65b (Last Login: 2007/05/20)Gamers_server;Gamer_name;Name2

Wobei die Länge mit den Namen Variable ist. Also da könnte nur 1 stehn aber auch 100.
Ansonsten sieht es eigentlich gleich aus. Datum, der Server und die ID ändert sich auch aber immer nach dem gleichen Muster.


Das mit dem SQL hab ich nun endlich verstanden ^^ das da immer der letze Wert drinnes steht, aber wie sage ich ihm denn das er nach jedem Durchlauf die Query ausführen soll ?

Danke
 
Zurück