Olli1967: Text einlesen, verändern und in eine Datenbank speichern.

Hallo zusammen,

ich habe folgende Aufgabenstellung bekommen:

1.) Stündlich Telegramme vom Server abzuziehen.
2.) Telegramme formatieren.
3.) formatierte Daten in einer Datenbank (MySQL) speichern.

Mein Lösungsansatz war, zuerst die Dateien mit Robocopy stündlich zu syncronisieren. Anschliessend in einer Textdatei zusammen fassen und mit PHP öffnen, bearbeiten......

------------------------------------------------------------------------------

Script 1:

<?php
$datei = file("G:/neu.txt");
$dateiR = "v:/file.csv";
$fp = fopen($dateiR,"w");
$i=0;
foreach($datei AS $ausgabe) {
   $ausgabe = strtr($ausgabe, ":", ",");
   $ausgabe = str_replace("<-", ",<-", $ausgabe);
   $ausgabe = str_replace("S->", ",S->", $ausgabe);
   $ausgabe = str_replace("<S", "S", $ausgabe);
   $ausgabe = str_replace("<M", "M", $ausgabe);
   $ausgabe = str_replace(" SP", ",SP", $ausgabe);
   $ausgabe = str_replace(" TCP", ",TCP", $ausgabe);
   $ausgabe = str_replace("*>", "*", $ausgabe);
   $ergebnis = trim ($ausgabe);
   $zerlegen = explode(",", $ergebnis);
   $zeile=implode(',',$zerlegen)."\n";
   fputs($fp,$zeile);
}

fputs($fp,$data); # daten in datei speichern
   $i++;

fclose($fp);
echo "fertig";
?>

----------------------------------------------------------------------------------

und speichern.

----------------------------------------------------------------------------

Script 2:

<?php
  $db = mysqli_connect("localhost","root","null","","3306") or die("Keine Verbindung zur Datenbank!");

$datum = date("Y-m-d");

//Eine Datenbank, mit dem aktuellen Datum als Bezeichnung, wird erstellt

$sql = "CREATE DATABASE telegramme";

$ergebnis=mysqli_query($db, $sql);

//Zur aktuellen(eben erstellten) Datenbank connecten

$db = mysqli_connect("localhost","root","null","telegramme","3306") or die("Keine Verbindung zur neuen Datenbank!");

//Tabelle wird erstellt

//$tabelle_erstellen="CREATE TABLE  connect".$datum." (                      ;Hier wird die Tabelle mit dem aktuellen Datum angelegt

$tabelle_erstellen="CREATE TABLE  daten (

Datum varchar(16)collate latin1_general_ci NOT NULL,
  Zeit varchar(12) collate latin1_general_ci NOT NULL,
  Melder varchar(10) collate latin1_general_ci NOT NULL,
  Richtung varchar(4) NOT NULL,
  Daten varchar(50) NOT NULL,

PRIMARY KEY  (Datum,Zeit)
) ENGINE=MyISAM DEFAULT CHARSET=latin1";

$ergebnis=mysqli_query($db, $tabelle_erstellen);

//Der von der Batchdatei erstellte Flatfile wird geöffnet und als Variable eingelesen.

$statistik = 'file.csv';
$fp = fopen ( $statistik, 'r' );

//Die Variable wird hier in sein Bestandteile zerlegt, neu zusammengefügt und anschliessend in die Datenbank geschrieben.

while (!feof($fp))
{
$ipteiler = fgets($fp);
list($t1, $t2, $t3, $t4, $t5, $t6, $t7, $t8, $t9) = explode(",", $ipteiler);
$ins = ("replace into telegramme.daten
values('".$t1.", ".$t2."','".$t3.":".$t4.":".$t5.":".$t6."','".$t7."','".$t8."','".$t9."');");

$ergebnis=mysqli_query($db, $ins);
  }
// Hier ist das Script durchgelaufen

echo 'beendet';

fclose($fp);

?>

------------------------------------------------------------------------------

Beim testen hat alles so funktioniert wie ich mir das vorgestellt hatte leider hatten die Testdateien auch nur eine Größe von 489kb und nicht 1GB.
Da ich PHP Neuling bin weiß ich jetzt nicht mehr weiter wie ich so eine Große Datei einlesen kann. Für Hilfe würde ich mich riesig freuen.

Gruß Olaf

  1. Hello,

    ich habe folgende Aufgabenstellung bekommen:

    1.) Stündlich Telegramme vom Server abzuziehen.

    wie sehen die aus?

    2.) Telegramme formatieren.

    was verstehst Du darunter?

    3.) formatierte Daten in einer Datenbank (MySQL) speichern.

    einzeln oder in Gruppen?

    Mein Lösungsansatz war, zuerst die Dateien mit Robocopy stündlich zu syncronisieren. Anschliessend in einer Textdatei zusammen fassen und mit PHP öffnen, bearbeiten......

    Beim Testen hat alles so funktioniert wie ich mir das vorgestellt hatte leider hatten die Testdateien auch nur eine Größe von 489kb und nicht 1GB.

    Um Hilfe zu bekommen, müsstest Du etwas mehr Information herauslassen.

    Wie liegen die Daten vor? Einzeln, 1000 pro Seite, ... ?
    Werden sie per HTTP abgerufen?
    Kann man sie auch in separaten Dateien abspeichern nach der Umformatierung?
    Wozu its die Formatierung notwendig?

    Also kurzgefasst müsstest Du etwas aussagen über

    • Quellformat
    • Zielformat

    Liebe Grüße aus dem schönen Oberharz

    Tom vom Berg

    --
    Nur selber lernen macht schlau
    http://bergpost.annerschbarrich.de
    1. Hallo Tom,

      Die Telegramme sehen wie folgt aus:

      Do,28.05.2009,10:10:21,171 TCP_SPK2 <-E:<SPK2MFR1LQ001406635292       *******************>
        Do,28.05.2009,10:10:21,609 TCP_SPK2 S->:<MFR1SPK2SI0606635398A   ****E 9066**************>
        Do,28.05.2009,10:10:21,656 TCP_SPK2 <-E:<SPK2MFR1LQ005406635291000865 *******************>
        Do,28.05.2009,10:10:21,765 TCP_SPK2 S->:<MFR1SPK2GI005406635291002168002470VBBE00********>
        Do,28.05.2009,10:10:22,156 TCP_SPK2 <-E:<SPK2MFR1LQ010806635235002515 *******************>
        Do,28.05.2009,10:10:22,515 TCP_SPK2 <-E:<SPK2MFR1LU010806635234FS0303********************>
        Do,28.05.2009,10:10:23,546 TCP_SPK2 <-E:<SPK2MFR1LQ001606635236000640 *******************>
        Do,28.05.2009,10:10:23,687 TCP_SPK2 S->:<MFR1SPK2SI0606635399A   ****B 9067**************>
        Do,28.05.2009,10:10:24,140 TCP_SPK2 <-E:<SPK2MFR1LQ011306634895007150 *******************>
        Do,28.05.2009,10:10:24,203 TCP_SPK2 <-E:<SPK2MFR1LT0600000010****************************>
        Do,28.05.2009,10:10:25,750 TCP_SPK2 <-E:<SPK2MFR1LQ009406635296       *******************>
        Do,28.05.2009,10:10:26,046 TCP_SPK2 <-E:<SPK2MFR1LQ005406635292000255 *******************>
      Do,28.05.2009,10:10:21,171 TCP_SPK2 <-E:<SPK2MFR1LQ001406635292       *******************>
        Do,28.05.2009,10:10:21,609 TCP_SPK2 S->:<MFR1SPK2SI0606635398A   ****E 9066**************>
        Do,28.05.2009,10:10:21,656 TCP_SPK2 <-E:<SPK2MFR1LQ005406635291000865 *******************>
        Do,28.05.2009,10:10:21,765 TCP_SPK2 S->:<MFR1SPK2GI005406635291002168002470VBBE00********>
        Do,28.05.2009,10:10:22,156 TCP_SPK2 <-E:<SPK2MFR1LQ010806635235002515 *******************>
        Do,28.05.2009,10:10:22,515 TCP_SPK2 <-E:<SPK2MFR1LU010806635234FS0303********************>
        Do,28.05.2009,10:10:23,546 TCP_SPK2 <-E:<SPK2MFR1LQ001606635236000640 *******************>
        Do,28.05.2009,10:10:23,687 TCP_SPK2 S->:<MFR1SPK2SI0606635399A   ****B 9067**************>
        Do,28.05.2009,10:10:24,140 TCP_SPK2 <-E:<SPK2MFR1LQ011306634895007150 *******************>
        Do,28.05.2009,10:10:24,203 TCP_SPK2 <-E:<SPK2MFR1LT0600000010****************************>
        Do,28.05.2009,10:10:25,750 TCP_SPK2 <-E:<SPK2MFR1LQ009406635296       *******************>
        Do,28.05.2009,10:10:26,046 TCP_SPK2 <-E:<SPK2MFR1LQ005406635292000255 *******************>

      Die Telegramme muss ich wie folgt in die Datenbank bekommen:

      ZB. anhand des letzten Telegramm.
      Wochentag: Do
      Datum: 28.05.2009
      Zeitstempel: 10:10:26,046
      Sender: TCP_SPK2
      Richtung: <-E
      Telegramm: SPK2MFR1LQ005406635292000255 *******************

      Das Telegramm "SPK2MFR1LQ005406635292000255 *******************" muss dann auch noch in seine Bestandteile zerlegt werden.

      LG Olaf

      1. Hallo Tom,

        Die Telegramme werden in eine Textdatei geschrieben bis sie 489kb groß ist. Danach wird eine neue Datei beschrieben.

        Die Dateien liegen auf einen Anwendungsserver und werden dann von mir abgezogen. Wir haben für unsere Zwecke einen Webserver wo wir Scripte etc. drauf laufen lassen können.

        Mein Problem ist halt, das ich weiß das man die Zeilen bestimmt auch einzelnen einlesen, Datenbankgerecht aufschlüsseln und dann in die Datenbank schreiben kann, leider bin ich noch nicht so weit mit PHP. Ich würde mich freuen wenn es da ein wenig Hilfe bekommen könnte.

        Gruß Olaf

      2. Hello,

        Die Telegramme sehen wie folgt aus:

        Do,28.05.2009,10:10:21,171 TCP_SPK2 <-E:<SPK2MFR1LQ001406635292       *******************>
          Do,28.05.2009,10:10:21,609 TCP_SPK2 S->:<MFR1SPK2SI0606635398A   ****E 9066**************>
          Do,28.05.2009,10:10:21,656 TCP_SPK2 <-E:<SPK2MFR1LQ005406635291000865 *******************>
          Do,28.05.2009,10:10:21,765 TCP_SPK2 S->:<MFR1SPK2GI005406635291002168002470VBBE00********>
          Do,28.05.2009,10:10:22,156 TCP_SPK2 <-E:<SPK2MFR1LQ010806635235002515 *******************>
          Do,28.05.2009,10:10:22,515 TCP_SPK2 <-E:<SPK2MFR1LU010806635234FS0303********************>
          Do,28.05.2009,10:10:23,546 TCP_SPK2 <-E:<SPK2MFR1LQ001606635236000640 *******************>
          Do,28.05.2009,10:10:23,687 TCP_SPK2 S->:<MFR1SPK2SI0606635399A   ****B 9067**************>
          Do,28.05.2009,10:10:24,140 TCP_SPK2 <-E:<SPK2MFR1LQ011306634895007150 *******************>
          Do,28.05.2009,10:10:24,203 TCP_SPK2 <-E:<SPK2MFR1LT0600000010****************************>
          Do,28.05.2009,10:10:25,750 TCP_SPK2 <-E:<SPK2MFR1LQ009406635296       *******************>
          Do,28.05.2009,10:10:26,046 TCP_SPK2 <-E:<SPK2MFR1LQ005406635292000255 *******************>
        Do,28.05.2009,10:10:21,171 TCP_SPK2 <-E:<SPK2MFR1LQ001406635292       *******************>
          Do,28.05.2009,10:10:21,609 TCP_SPK2 S->:<MFR1SPK2SI0606635398A   ****E 9066**************>
          Do,28.05.2009,10:10:21,656 TCP_SPK2 <-E:<SPK2MFR1LQ005406635291000865 *******************>
          Do,28.05.2009,10:10:21,765 TCP_SPK2 S->:<MFR1SPK2GI005406635291002168002470VBBE00********>
          Do,28.05.2009,10:10:22,156 TCP_SPK2 <-E:<SPK2MFR1LQ010806635235002515 *******************>
          Do,28.05.2009,10:10:22,515 TCP_SPK2 <-E:<SPK2MFR1LU010806635234FS0303********************>
          Do,28.05.2009,10:10:23,546 TCP_SPK2 <-E:<SPK2MFR1LQ001606635236000640 *******************>
          Do,28.05.2009,10:10:23,687 TCP_SPK2 S->:<MFR1SPK2SI0606635399A   ****B 9067**************>
          Do,28.05.2009,10:10:24,140 TCP_SPK2 <-E:<SPK2MFR1LQ011306634895007150 *******************>
          Do,28.05.2009,10:10:24,203 TCP_SPK2 <-E:<SPK2MFR1LT0600000010****************************>
          Do,28.05.2009,10:10:25,750 TCP_SPK2 <-E:<SPK2MFR1LQ009406635296       *******************>
          Do,28.05.2009,10:10:26,046 TCP_SPK2 <-E:<SPK2MFR1LQ005406635292000255 *******************>

        Das beantwortet aber noch nicht die Frage, ob diese Telegramme alle in einer einzigen Datei vorliegen oder in mehreren und was mit den abgearbeiteten passieren muss/darf.

        Handelt es sich um eine Textdatei, also eine, die ein eindeutiges Zeilenendezeichen für das Satzende verwendet? Diese(s) Zeichen darf/dürfen dann erstmal in den übrigen Telegrammdaten (innerhalb des Satzes) nicht vorkommen.

        Liebe Grüße aus dem schönen Oberharz

        Tom vom Berg

        --
        Nur selber lernen macht schlau
        http://bergpost.annerschbarrich.de
        1. Hallo Tom,

          alles was in der Datenbank steht kann im Textfile gelöscht werden.

          Olaf

          Gruß aus dem sonnigen Bremen.

          1. Hello,

            alles was in der Datenbank steht kann im Textfile gelöscht werden.

            Also ist das Hauptproblem erst einmal die Zerlegung des Datensatzes in einzelne Felder.
            Das geht im Prinzip ohne Regular Expressions mit Explode. Das wird vermutlich schneller sein, als die RegExp.

            Do,28.05.2009,10:10:21,171 TCP_SPK2 <-E:<SPK2MFR1LQ001406635292       *******************>

            $fh = fopen('filename','rb+');
            if (!$fh) die('kann Datei nicht öffnen');
            flock($fh, LOCK_SH);

            $count = 0;

            while (false !== ($line = fgets($fh, 4096))
            {
                $_telegram = explode(':<', $line);

            ## 0: Do,28.05.2009,10:10:21,171 TCP_SPK2 <-E
                ## 1: SPK2MFR1LQ001406635292       *******************>      ==> Payload

            $_header = explode(' ', $_telegram[0]);
                ## 0: Do,28.05.2009,10:10:21,171
                ## 1: TCP_SPK2                                ==>
                ## 2: <-E                                     ==> Richtung

            $_date = explode (',',$_header[0]);
                ## 0: Do                                      ==> WoTag
                ## 1: 28.05.2009                              ==> Datum
                ## 2: 10:10:21                                ==> Zeit
                ## 3: 171                                     ==> ?

            ## -->   Ergebniselemente für die Datenbank escpapen und dann ein Insert durchführen.
                ##
                ##

            echo ".";  ## Ich lebe noch.

            }
            fclose($fh);

            Um die Payload weiter zu zerlegen ($_telegram[1]) müsstest Du etwas über die in ***** erlaubten Zeichen sagen.

            Die Scriptlaufzeit muss sicherlich auf "unendlich" hochgestellt werden.
            http://de3.php.net/manual/en/function.set-time-limit.php

            Die Zeichencodierung müsste ggf. noch beachtet werden.

            So ergibt sich ein Insert pro Datensatz in die SQL-Tabelle.
            Das könnte man auch anders machen, wenn man stattdessen die Telegramm-Datei in eine eine CSV-Datei konvertiert.

            Dann könnte man mit einem SQL-Import-Tool arbeiten.

            Ich frage mich, wer sich derartige Formate (für die Telegrammdatei) ausdenkt. Das Glöeiche Problem hat man aber z.B. auch bei den Logs des Apache-Webserver bei Verwendung des Standard-LogFormat...
            Da fragt man sich wirklich, wie weit die Leute manchmal denken...

            Liebe Grüße aus dem schönen Oberharz

            Tom vom Berg

            --
            Nur selber lernen macht schlau
            http://bergpost.annerschbarrich.de
            1. Hallo Tom,

              danke für deine Unterstützung, aber das Zerlegen und in die Datenbank drücken das funktioniert bei mir schon.

              Mein Script:

                
                
              <?php  
              $datei = file("G:/xampp/htdocs/Kartonwege/Daten_Source/neu/neu.txt");  
              $dateiR = "G:/xampp/htdocs/Kartonwege/Daten_Destination/file.csv";  
              $fp = fopen($dateiR,"w");  
              $i=0;  
              foreach($datei AS $ausgabe) {  
                 $ausgabe = strtr($ausgabe, ":", ",");  
                 $ausgabe = str_replace("<-", ",<-", $ausgabe);  
                 $ausgabe = str_replace("S->", ",S->", $ausgabe);  
                 $ausgabe = str_replace("<S", "S", $ausgabe);  
                 $ausgabe = str_replace("<M", "M", $ausgabe);  
                 $ausgabe = str_replace(" SP", ",SP", $ausgabe);  
                 $ausgabe = str_replace(" TCP", ",TCP", $ausgabe);  
                 $ausgabe = str_replace("*>", "*", $ausgabe);  
                 $ergebnis = trim ($ausgabe);  
                 $zerlegen = explode(",", $ergebnis);  
                 $zeile=implode(',',$zerlegen)."\n";  
                 fputs($fp,$zeile);  
              }  
                
              fputs($fp,$data); # daten in datei speichern  
                 $i++;  
                
              fclose($fp);  
              echo "fertig";  
                
              $db = mysqli_connect("localhost","root","start","","3306") or die("Keine Verbindung zur Datenbank!");  
                
              $datum = date("Y-m-d");  
                
              //Eine Datenbank, mit dem aktuellen Datum als Bezeichnung, wird erstellt  
                
              $sql = "CREATE DATABASE `telegramme`";  
                
              $ergebnis=mysqli_query($db, $sql);  
                
              //Zur aktuellen(eben erstellten) Datenbank connecten  
                
              $db = mysqli_connect("localhost","root","start","telegramme","3306") or die("Keine Verbindung zur neuen Datenbank!");  
                
              //Tabelle wird erstellt  
                
              $tabelle_erstellen="CREATE TABLE  `daten` (  
                
                `Wochentag` varchar(2)collate latin1_general_ci NOT NULL,  
                `Datum` varchar(16)collate latin1_general_ci NOT NULL,  
                `Zeit` varchar(12) collate latin1_general_ci NOT NULL,  
                `Melder` varchar(10) collate latin1_general_ci NOT NULL,  
                `Richtung` varchar(4) NOT NULL,  
                `Daten` varchar(50) NOT NULL,  
                
                PRIMARY KEY  (`Datum`,`Zeit`)  
              ) ENGINE=MyISAM DEFAULT CHARSET=latin1";  
                
                
              $ergebnis=mysqli_query($db, $tabelle_erstellen);  
                
              //Der von der Batchdatei erstellte Flatfile wird geöffnet und als Variable eingelesen.  
                
              $statistik = 'G:/xampp/htdocs/Kartonwege/Daten_Destination/file.csv';  
              $fp = fopen ( $statistik, 'r' );  
                
              //Die Variable wird hier in sein Bestandteile zerlegt, neu zusammengefügt und anschliessend in die Datenbank geschrieben.  
                
              while (!feof($fp))  
              {  
              	$ipteiler = fgets($fp);  
              	list($t1, $t2, $t3, $t4, $t5, $t6, $t7, $t8, $t9) = explode(",", $ipteiler);  
              	  
              	$ins = ("replace into telegramme.`daten`  
              	values('".$t1."','".$t2."','".$t3.":".$t4.":".$t5.":".$t6."','".$t7."','".$t8."','".$t9."');");  
              	echo ".";  
              	  
              $ergebnis=mysqli_query($db, $ins);  
                	}  
                
              // Hier ist das Script durchgelaufen  
              	  
                echo 'beendet';  
                
              fclose($fp);  
                
              ?>  
                
              
              

              Das Script läuft pro Datei 489kb = ungefair 5500 Zeilen in unter 5 sek. durch.

              Die Frage die ich als Laie habe ist, wie kann ich eine Datei nach der anderen einlesen und Verarbeiten? Ich weiß nicht wie man eine Schleife macht die nacheinander Datei für Datei in einem Ordner einliest.
              Weil bei dem Versuch alles in einer Datei einzulesen macht PHP dicke Backen.

              Zu deiner Frage Payload kommt im Anschluss folgendes:
              díe Telegramme kommen von einer Fördertechnik die Kartons befördert. das Telegramm (bei dir PAYLOAD genannt) ist immer genau 50 Zeichen lang. Es beinhaltet unter anderem die Kartonnummer (8stellig), Platzhalter (*), Gewichte Tara und Brutto, und an welchen Übergangspunkten der Karton vorbei gerauscht ist. Es sind Telegramme zwischen dem MFR (Materialflussrechner) und den SPS en.

              ich danke dir nochmal im vorraus für die Hilfe.

              Gruß Olaf

              1. Hello Olaf,

                danke für deine Unterstützung, aber das Zerlegen und in die Datenbank drücken das funktioniert bei mir schon.

                Und Deine Idee für die Zerlegung ist sogar viel besser ;-)

                Und da steckt ja der "Schweinehund":

                $datei = file("G:/xampp/htdocs/Kartonwege/Daten_Source/neu/neu.txt");

                file() liest alle Datensätze auf einmal in den Speicher ein. Da ist dann irgendwann Feierabend.

                Deshalb hatte ich Dir ja den Vorschlag gemacht, das mit

                fopen()       http://de3.php.net/manual/en/function.fopen.php
                    flock()       http://de3.php.net/manual/en/function.flock.php
                    +->
                    |  fgets()    http://de3.php.net/manual/en/function.flock.php
                    +-<
                    fclose()      http://de3.php.net/manual/en/function.fclose.php
                  ( unlink() )    http://de3.php.net/manual/en/function.unlink.php

                zu machen.

                Wenn Du nun noch mehrere Dateien abzuarbeiten hast, kannst Du die vorher mit

                glob()        http://de3.php.net/manual/en/function.glob.php

                ganz bequem abfragen.

                fgets() hat ein paar Besonderheiten bezüglich der Anzahl der gelesenen Zeichen. Es ist also auf jeden Fall ratsam, den Leseauftrag in Bytes nicht zu klein zu machen :-)

                $sql = "CREATE DATABASE telegramme";

                Brauchst Du tatsächlich immer eine neue Datenbank, oder würde es eine neue Tabelle in einer gemeinsamen Datenbank auch tun?

                Im Prinzip kannst Du auch alle Daten in eine Tabelle schreiben, wenn das Satzformat gleich bleibt.

                //Der von der Batchdatei erstellte Flatfile wird geöffnet und als Variable eingelesen.

                Wenn Du soweit schon bist, dann müsste das auch  mit

                http://dev.mysql.com/doc/refman/5.1/en/mysqlimport.html

                oder mit

                LOAD DATA LOCAL INFILE '/importfile.csv'
                    INTO TABLE test_table
                    FIELDS TERMINATED BY ','
                    LINES TERMINATED BY '\n'
                    (field1, filed2, field3);

                http://www.modwest.com/help/kb.phtml?qid=253&cat=6

                Ist eine interessante Aufgabe.

                PHP benötigst Du dafür vermutlich auch nicht. Auf einem Linux-Host würde die Konvertierung auch mit einem Shellscript zu schaffen sein, das dann vermutlich auch schneller ist. Allerdings sit die Programmierung nicht so bequem, wie mit PHP.

                Liebe Grüße aus dem schönen Oberharz

                Tom vom Berg

                --
                Nur selber lernen macht schlau
                http://bergpost.annerschbarrich.de
                1. Hello,

                  Wenn Du soweit schon bist, dann müsste das auch  mit

                  http://dev.mysql.com/doc/refman/5.1/en/mysqlimport.html

                  oder mit

                  LOAD DATA LOCAL INFILE '/importfile.csv'
                      INTO TABLE test_table
                      FIELDS TERMINATED BY ','
                      LINES TERMINATED BY '\n'
                      (field1, filed2, field3);

                  http://www.modwest.com/help/kb.phtml?qid=253&cat=6

                  jetzt, da ich das Posting abgeschickt habe, habe ich auch die Originalseite im MySQL-Handbuch gefunden. Vorhin wollte die nicht...

                  http://dev.mysql.com/doc/refman/5.1/en/load-data.html

                  Liebe Grüße aus dem schönen Oberharz

                  Tom vom Berg

                  --
                  Nur selber lernen macht schlau
                  http://bergpost.annerschbarrich.de
                  1. Hallo Tom,

                    das versteh ich als Laie jetzt überhaupt nicht, sorry.
                    Die von dir gepostete "Load Infile" Funktion ist doch für den Datenimport nach MySQL auf Commandozeile gedacht oder? Ich habe aber doch kein Problem mit dem Datenimport. Ich benötige doch nur einen Tipp, wie ich verschiedene Textfiles zb. 1.txt, 2.txt, 3.txt usw. mit dem von mir geposteten Script zu händeln sind. Ich weiß wie ich eine Datei öffne (wie im Script zu sehen) aber nicht wie ich namentlich verschiedene nacheinander öffne.

                    Gruß aus Bremen

                  2. ;-) Sorry hatte ein Posting von dir übersprungen.

                    schaue mir die von dir beschriebenen Funktionen mal an.
                    --------------------------------------------------------------------------
                     fopen()       http://de3.php.net/manual/en/function.fopen.php
                        flock()       http://de3.php.net/manual/en/function.flock.php
                        +->
                        |  fgets()    http://de3.php.net/manual/en/function.flock.php
                        +-<
                        fclose()      http://de3.php.net/manual/en/function.fclose.php
                      ( unlink() )    http://de3.php.net/manual/en/function.unlink.php

                    glob()        http://de3.php.net/manual/en/function.glob.

                    --------------------------------------------------------------------------

                    Gruß Olaf

                2. Hallo Tom,

                  das mit dem dopen und fgets habe ich jetzt so gelöst:

                  --------------------------------------------------------

                    
                  <?php  
                  $datei = fopen("z:/neu.txt", "r");  
                  $dateiR = "z:/file.csv";  
                  $fp = fopen($dateiR,"w");  
                  $i=0;  
                  if ($datei) {  
                      while (!feof($datei)) {  
                     $ausgabe = fgets($datei, 4096);  
                    
                     $ausgabe = strtr($ausgabe, ":", ",");  
                     $ausgabe = str_replace("<-", ",<-", $ausgabe);  
                     $ausgabe = str_replace("S->", ",S->", $ausgabe);  
                     $ausgabe = str_replace("<S", "S", $ausgabe);  
                     $ausgabe = str_replace("<M", "M", $ausgabe);  
                     $ausgabe = str_replace(" SP", ",SP", $ausgabe);  
                     $ausgabe = str_replace(" TCP", ",TCP", $ausgabe);  
                     $ausgabe = str_replace("*>", "*", $ausgabe);  
                     $ergebnis = trim ($ausgabe);  
                     $zerlegen = explode(",", $ergebnis);  
                     $zeile=implode(',',$zerlegen)."\n";  
                     fputs($fp,$zeile);  
                     $i++;  
                     echo ".";  
                     }  
                  }  
                  echo "fertig! es wurden $i Zeilen bearbeitet";  
                  fclose($fp);  
                  ?>
                  

                  ------------------------------------------------------------

                  Aber das mit dem glob krieg ich nicht auf'm Schirm.

                  Gruß Olaf

                  1. Hello,

                    Hallo Tom,

                    das mit dem dopen und fgets habe ich jetzt so gelöst:


                    <?php

                    function convert_file($source, $target)
                    {

                    #> $datei = fopen("z:/neu.txt", "r");

                    $source = fopen($source, "rb");

                    $dateiR = "z:/file.csv";

                    #> $fp = fopen($dateiR,"w");
                    $target = fopen($target,"wb");

                    $i=0;

                    #> if ($datei)
                    #  {
                    if ($source and $target)
                    {

                    #>     while (!feof($datei)) {
                      while (false !== ($inputstr = fgets($datei, 4096))
                      {
                         $i++;

                    #     [...]  Deine Anweisungen mit $inputstr statt $ausgabe :-))

                    fputs($target, $zeile);

                    echo ".";
                       }
                    }

                    else
                      {
                          return false;
                      }

                    echo "fertig! von $source wurden $i Zeilen bearbeitet<br>";
                      fclose($source);
                      fclose($target);

                    return true;
                    }

                    ?>

                    
                    >   
                    > ------------------------------------------------------------  
                    >   
                    > Aber das mit dem glob krieg ich nicht auf'm Schirm.  
                      
                    Ok, zum obigen nur ein paar Schöheitskorrekturen:  
                    - Sprechende Variablennamen  
                    - Prüfen, ob Quelle UND Ziel geöffnet werden konnten  
                    - while-Schleife nicht abhängig machen von feof(), sondern von fgets()  
                      PHP setzt das hier schon entsprechend um  
                      Der Filezugriff wird im Hintergund gepuffert.  
                      
                      
                    und nun packen wird die ganze entstandene Funktion in eine Schleife:  
                      
                      
                    $\_filenames = glob('path/to/file/\*.telegram');  
                      
                    if (is\_array($\_filenames))   ## es würde auch reichen "if ($filenames)", aber das ist schmuddleig  
                    {  
                        foreach($\_filenames as $source)  
                        {  
                            $target = $source.'.csv';      ## Zieldatei heitß dann z.B. 'T20090603.telegram.csv'  
                            $ready = convert\_file($source, $target);  
                      
                            if ($ready)  
                            {  
                                echo "$source wurde fehlerfrei konvertiert<br>";  
                            }  
                            else  
                            {  
                                echo "<p>$source konnte nicht fehlerfrei konvertiert werden!</p>";  
                            }  
                        }  
                    }  
                      
                      
                      
                    Nur so als grober Fahrplan.  
                      
                    Also:  
                      
                    - Funktion aus der Konvertierung machen  
                    - Glob aufrufen und damit ein Array der Dateinamen erzeugen  
                    - Funktion in der Schleife für jedes Element von der Globbbed-List aufrufen.  
                      
                      
                      
                      
                      
                      
                    Liebe Grüße aus dem schönen Oberharz  
                      
                      
                    Tom vom Berg  
                    ![](http://selfhtml.bitworks.de/Virencheck.gif)  
                      
                    
                    -- 
                    Nur selber lernen macht schlau  
                    <http://bergpost.annerschbarrich.de>
                    
                    1. Guten Morgen Tom,

                      habe das Script jetzt mal zusammengedängelt. Leider funktioniert es irgendwie nicht. Mache ich da was falsch. :-(

                      ------------------------------------------------------------------------

                        
                      <?php  
                        
                      function convert_file($source, $target)  
                        
                        $source = fopen($source, "rb");  
                        $target = fopen($target,"wb");  
                        $i=0;  
                        
                        if ($source and $target)  
                      {  
                        while (false !== ($inputstr = fgets($source, 4096))  
                      {  
                         $inputstr = strtr($inputstr, ":", ",");  
                         $inputstr = str_replace("<-", ",<-", $inputstr);  
                         $inputstr = str_replace("S->", ",S->", $inputstr);  
                         $inputstr = str_replace("<S", "S", $inputstr);  
                         $inputstr = str_replace("<M", "M", $inputstr);  
                         $inputstr = str_replace(" SP", ",SP", $inputstr);  
                         $inputstr = str_replace(" TCP", ",TCP", $inputstr);  
                         $inputstr = str_replace("*>", "*", $inputstr);  
                         $ergebnis = trim ($inputstr);  
                         $zerlegen = explode(",", $ergebnis);  
                         $zeile=implode(',',$zerlegen)."\n";  
                         fputs($target,$zeile);  
                        
                        $i++;  
                           fputs($target, $zeile);  
                         echo ".";  
                       }  
                        
                        else  
                        {  
                         return false;  
                        }  
                        
                        echo "fertig! von $source wurden $i Zeilen bearbeitet<br>";  
                        fclose($source);  
                        fclose($target);  
                        
                        return true;  
                      }  
                        
                      $_filenames = glob('G:/xampp/htdocs/Kartonwege/Daten_Source/*.txt');  
                        
                      if (is_array($_filenames))   ## es würde auch reichen "if ($filenames)", aber das ist schmuddleig  
                      {  
                          foreach($_filenames as $source)  
                          {  
                              $target = $source.'.csv';      ## Zieldatei heitß dann z.B. 'T20090603.telegram.csv'  
                              $ready = convert_file($source, $target);  
                        
                              if ($ready)  
                              {  
                                  echo "$source wurde fehlerfrei konvertiert<br>";  
                              }  
                              else  
                              {  
                                  echo "<p>$source konnte nicht fehlerfrei konvertiert werden!</p>";  
                              }  
                          }  
                      }  
                        
                      ?>  
                      
                      

                      ----------------------------------------------------------------------

                      Ich habe noch nie mit declaration von Funktionen gearbeitet.

                      Gruß Olaf

                      1. Hello,

                        Guten Morgen Tom,

                        habe das Script jetzt mal zusammengedängelt. Leider funktioniert es irgendwie nicht. Mache ich da was falsch. :-(


                        <?php

                        error_reporting(E_ALL);    ## das kann zum Entwickeln ganz hilfreich sein!

                        function convert_file($source, $target)

                        $source = fopen($source, "rb");
                          $target = fopen($target,"wb");
                          $i=0;

                        if ($source and $target)

                        {

                        while (false !== ($inputstr = fgets($source, 4096))
                              {
                                  $inputstr = strtr($inputstr, ":", ",");
                                  $inputstr = str_replace("<-", ",<-", $inputstr);
                                  $inputstr = str_replace("S->", ",S->", $inputstr);
                                  $inputstr = str_replace("<S", "S", $inputstr);
                                  $inputstr = str_replace("<M", "M", $inputstr);
                                  $inputstr = str_replace(" SP", ",SP", $inputstr);
                                  $inputstr = str_replace(" TCP", ",TCP", $inputstr);
                                  $inputstr = str_replace(">", "", $inputstr);
                                  $ergebnis = trim ($inputstr);

                        $zerlegen = explode(",", $ergebnis);

                        $zeile=implode(',',$zerlegen)."\n";

                        ##            fputs($target,$zeile);    ## das war doppelt

                        $i++;
                                  fputs($target, $zeile);
                                  echo ".";
                              }

                        }                                   ## Klammer hat gefehlt

                        else
                          {

                        fclose($source);                ## besser ist's, [ ... ]
                                fclose($target);                ## vor dem Abbrechen Files schließen

                        return false;
                          }

                        echo "fertig! von $source wurden $i Zeilen bearbeitet<br>";
                          fclose($source);
                          fclose($target);

                        return true;
                        }

                        $_filenames = glob('G:/xampp/htdocs/Kartonwege/Daten_Source/*.txt');

                        if (is_array($_filenames))   ## es würde auch reichen "if ($filenames)", aber das ist schmuddleig
                        {
                            foreach($_filenames as $source)
                            {
                                $target = $source.'.csv';      ## Zieldatei heitß dann z.B. 'T20090603.telegram.csv'
                                $ready = convert_file($source, $target);

                        if ($ready)
                                {
                                    echo "$source wurde fehlerfrei konvertiert<br>";
                                }
                                else
                                {
                                    echo "<p>$source konnte nicht fehlerfrei konvertiert werden!</p>";
                                }
                            }
                        }

                        ?>

                        
                        >   
                        > ----------------------------------------------------------------------  
                        >   
                        > Ich habe noch nie mit declaration von Funktionen gearbeitet.  
                          
                        Sonst entdecke ich jetzt nichts mehr.  
                        Nimm das Error\_Reporting(E\_ALL) mit rein.  
                          
                        Und wenn Du Fehlermeldungen bekommst, dann poste die auf jeden Fall vollständig. Das vereinfacht ungemein die Hilfestellung.  
                          
                        In dieses Verzeichnis muss der Apache (PHP) auch schreiben dürfen!  
                          
                            G:/xampp/htdocs/Kartonwege/Daten\_Source/  
                          
                          
                          
                          
                        Liebe Grüße aus dem schönen Oberharz  
                          
                          
                        Tom vom Berg  
                        ![](http://selfhtml.bitworks.de/Virencheck.gif)  
                          
                        
                        -- 
                        Nur selber lernen macht schlau  
                        <http://bergpost.annerschbarrich.de>
                        
                        1. Hallo Tom,

                          erstmal Danke für deine Zeit. Habe das Script nachgebessert und ausgeführt.
                          Keine Fehlermeldung oder ähnliches. Es passierte rein gar nichts. Einfach wieder der Prompt.

                          Wenn ich das richtig verstanden habe schaut glob in den angegebenen Pfad nach Text Dateien.

                          $_filenames = glob('G:/xampp/htdocs/Kartonwege/Daten_Source/*.txt');

                          dann schreibt er der Variable $source die möglichen Textdateien zu.
                          Wenn vorhanden wird die Function conver_file aufgerufen die dann den Text ändert und als $source.csv zurück speichert.

                          Es passiert aber rein nichts und es kommt keine Meldung.

                          Die Dateien heißen im Original z.B.:

                          H1_PROT_SPS3_SPON_20060817212028.TXT

                          Gruß Olaf

                          1. Hallo Tom,

                            im Browser erhalte ich folgende Meldung:

                            Parse error: parse error, unexpected T_VARIABLE, expecting '{' in G:\xampp\htdocs\Kartonwege\Karton.php on line 7

                            Gruß Olaf

                            1. Hello,

                              Parse error: parse error, unexpected T_VARIABLE, expecting '{' in G:\xampp\htdocs\Kartonwege\Karton.php on line 7

                              Das ist vermutlich die Zeile nach function convert_file()

                              function convert_file($source, $target)

                              $source = fopen($source, "rb");
                                $target = fopen($target,"wb");
                                $i=0;

                              Da fehlte die öffnende Klammer für den Funktionskörper:

                              function convert_file($source, $target)
                              {
                                  $source = fopen($source, "rb");
                                  $target = fopen($target,"wb");
                                  $i=0;

                              Liebe Grüße aus dem schönen Oberharz

                              Tom vom Berg

                              --
                              Nur selber lernen macht schlau
                              http://bergpost.annerschbarrich.de
                              1. Guten Morgen,

                                hat leider nicht funktioniert. Habe jetzt folgende Fehlermeldung:

                                Parse error: parse error, unexpected '{' in G:\xampp\htdocs\Kartonwege\Karton.php on line 14

                                Aber auf Zeile 14 enddecke ich keinen Fehler.

                                  
                                <?php  
                                  
                                error_reporting(E_ALL);    ## das kann zum Entwickeln ganz hilfreich sein!  
                                  
                                function convert_file($source, $target)  
                                {  
                                  $source = fopen($source, "rb");  
                                  $target = fopen($target,"wb");  
                                  $i=0;  
                                  
                                  if ($source and $target)  
                                {  
                                	while (false !== ($inputstr = fgets($source, 4096))  
                                	{  
                                		$inputstr = strtr($inputstr, ":", ",");  
                                		$inputstr = str_replace("<-", ",<-", $inputstr);  
                                		$inputstr = str_replace("S->", ",S->", $inputstr);  
                                		$inputstr = str_replace("<S", "S", $inputstr);  
                                		$inputstr = str_replace("<M", "M", $inputstr);  
                                		$inputstr = str_replace(" SP", ",SP", $inputstr);  
                                		$inputstr = str_replace(" TCP", ",TCP", $inputstr);  
                                		$inputstr = str_replace("*>", "*", $inputstr);  
                                		$ergebnis = trim ($inputstr);  
                                		$zerlegen = explode(",", $ergebnis);  
                                		$zeile=implode(',',$zerlegen)."\n";  
                                		fputs($target,$zeile);  
                                		$i++;  
                                		echo ".";  
                                	}  
                                }  
                                 else  
                                {  
                                	fclose($source);  
                                	fclose($target);  
                                	  
                                  return false;  
                                }  
                                  
                                	echo "fertig! von $source wurden $i Zeilen bearbeitet<br>";  
                                	fclose($source);  
                                	fclose($target);  
                                  
                                  return true;  
                                }  
                                  
                                $_filenames = glob('*.txt');  
                                  
                                if (is_array($_filenames))   ## es würde auch reichen "if ($filenames)", aber das ist schmuddleig  
                                {  
                                    foreach($_filenames as $source)  
                                    {  
                                        $target = $source.'.csv';      ## Zieldatei heitß dann z.B. 'T20090603.telegram.csv'  
                                        $ready = convert_file($source, $target);  
                                  
                                        if ($ready)  
                                        {  
                                            echo "$source wurde fehlerfrei konvertiert<br>";  
                                        }  
                                        else  
                                        {  
                                            echo "<p>$source konnte nicht fehlerfrei konvertiert werden!</p>";  
                                        }  
                                    }  
                                }  
                                ?>  
                                  
                                
                                

                                Wo wird denn das Error Reporting ausgegeben?

                                "error_reporting(E_ALL);"

                                Schöne Grüße aus Bremen

                                Olaf

                                1. Hello,

                                  hat leider nicht funktioniert. Habe jetzt folgende Fehlermeldung:

                                  Parse error: parse error, unexpected '{' in G:\xampp\htdocs\Kartonwege\Karton.php on line 14

                                  Aber auf Zeile 14 entdecke ich keinen Fehler.

                                  Wäre schon gut, wenn Du auch dazuschreiben würdest, was bei Dir Zeile 14 ist, damit man nicht erst raten muss. Ich nehme an, es ist die Zeile _nach_

                                  while (false !== ($inputstr = fgets($source, 4096))

                                  da fehlt eine ) in Zeile 13, was PHP dann in Zeile 14 aus der Bahn wirft.

                                  while (false !== ($inputstr = fgets($source, 4096)))

                                  Das müsstest Du nun aber mal versuchen, die Syntax zu verstehen und zu kontrollieren.

                                  Liebe Grüße aus dem schönen Oberharz

                                  Tom vom Berg

                                  --
                                  Nur selber lernen macht schlau
                                  http://bergpost.annerschbarrich.de
                                  1. Hallo Tom,

                                    Danke für deine Hilfe, habe das Script nochmal mit einem richtigen Editor angeschaut und dann auch den Syntax Fehler gefunden (Windows Notepad war da wohl nicht ganz richtig ;-)). Jetzt läuft es gut durch.
                                    Im Eifer des Gefechts habe ich auch gleich ein 2tes Script für den Datenimport geschrieben was auch funktioniert. Was ich da nur nicht verstanden habe ist, das die Zeile:

                                      
                                    while (false !== (fgets($source)))  
                                    
                                    

                                    nur genau die Hälfte importiert, während alles prima funktioniert mit:

                                      
                                    while (false !== (!feof($source)))  
                                    
                                    

                                    Hier nochmal das ganze 2te Script:

                                      
                                    <?php  
                                    error_reporting(E_ALL);  
                                      
                                    function daten_import($source)  
                                    {  
                                      $source = fopen($source, "rb");  
                                      $db = mysqli_connect("localhost","root","start","","3306") or die("Keine Verbindung zur Datenbank!");  
                                      $sql = "CREATE DATABASE `telegramme`";  
                                      $ergebnis=mysqli_query($db, $sql);  
                                      $i=0;  
                                      
                                      if ($source)  
                                    {  
                                    	while (false !== (!feof($source)))  
                                    	{  
                                    		$ipteiler = fgets($source);  
                                    	list($t1, $t2, $t3, $t4, $t5, $t6, $t7, $t8, $t9) = explode(",", $ipteiler);  
                                    	  
                                    	$ins = ("replace into telegramme.`daten`  
                                    	values('".$t1."','".$t2."','".$t3.":".$t4.":".$t5.":".$t6."','".$t7."','".$t8."','".$t9."');");  
                                        $i++;  
                                    	echo ".";  
                                    	  
                                    $ergebnis=mysqli_query($db, $ins);  
                                    //$muell_loeschen=("delete from telegramme.`daten` where richtung not like 'S->' and richtung not like '<-E'");  
                                    //$ergebnis=mysqli_query($db, $muell_loeschen);  
                                      
                                      	}  
                                    }  
                                     else  
                                    {  
                                    	fclose($source);  
                                     return false;  
                                    }  
                                      
                                    	echo "fertig! von $source wurden $i Zeilen in die Datenbank geschoben<br>";  
                                    	fclose($source);  
                                      return true;  
                                    }  
                                      
                                    // Hier ist das Script durchgelaufen  
                                    $_filenames = glob('G:\xampp\htdocs\Kartonwege\Daten_Source\*.csv');  
                                      
                                    if (is_array($_filenames))  
                                    {  
                                        foreach($_filenames as $source)  
                                        {  
                                            $ready = daten_import($source);  
                                      
                                            if ($ready)  
                                            {  
                                                echo "$source wurde fehlerfrei eingelesen<br>";  
                                            }  
                                            else  
                                            {  
                                                echo "<p>$source konnte nicht fehlerfrei eingelesen werden!</p>";  
                                            }  
                                        }  
                                    }  
                                      
                                    ?>  
                                      
                                    
                                    

                                    Nochmal Danke.

                                    Gruß Olaf

                                    1. Hello,

                                      Hallo Tom,

                                      Danke für deine Hilfe, habe das Script nochmal mit einem richtigen Editor angeschaut und dann auch den Syntax Fehler gefunden (Windows Notepad war da wohl nicht ganz richtig ;-)). Jetzt läuft es gut durch.
                                      Im Eifer des Gefechts habe ich auch gleich ein 2tes Script für den Datenimport geschrieben was auch funktioniert. Was ich da nur nicht verstanden habe ist, das die Zeile:

                                      while (false !== (fgets($source)))

                                        
                                      Das müsste ja auch heißen:  
                                        
                                            while (false !== ($inputstr = fgets($source, 4096))  
                                        
                                      die Zeile wird geholt aus der Datei und nur, wenn fgets() false liefert, wird abgebrochen, aber nicht dann, wenn fgets() z.B. in der Zeile nur eine '0' findet.  
                                        
                                        
                                        
                                        
                                        
                                        
                                        
                                      Liebe Grüße aus dem schönen Oberharz  
                                        
                                        
                                      Tom vom Berg  
                                      ![](http://selfhtml.bitworks.de/Virencheck.gif)  
                                        
                                      
                                      -- 
                                      Nur selber lernen macht schlau  
                                      <http://bergpost.annerschbarrich.de>