Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] Datei bearbeitung (Verwaltungsgrenzen)

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • [Erledigt] Datei bearbeitung (Verwaltungsgrenzen)

    Hallo Leute,
    ich bin dabei .ASC Dateien zu bearbeiten, welche um die 70.000 Zeilen �* 400 Zeichen enthalten.

    Nur leider habe ich in der Entwicklungsphase mit einer Datei von 800 Zeilen gearbeitet.
    Alle Datensätze habe ich in ein Array geschrieben, weil ich eigentlich ohne Datenbank arbeiten wollte, nun komm ich aber nicht drum rum.

    Wenn ich in ein Array schreiben lasse muss ich erstmal den Speicher hoch setzten, damit er überhaupt anfängt.

    PHP-Code:
    ini_set("memory_limit""80M"); 
    Leider durchsucht er meine Dateien (die Große) aber nicht effizient, er findet keine Datensätze. Woran es liegt kann ich nicht genau sagen aber ich habe den Verdacht, dass vielleicht ein unsichtbare Codierungfehler in der Datei. Woher der Verdacht kommt steht unten.

    Bei meiner Testdatei (die Kleine) funktioniert alles wunderbar.

    Also wollte ich gern jede Zeile in die Datenbank schreiben, da die Leerzeichen sehr wichtig sind muss ich die gesamte Zeile (400 Zeichen) in eine Spalte schreiben, was bei mir folgendermaßen aussieht:


    PHP-Code:
    // ich schreib mal die Variablen rüber
    $DatanameOld "Pfad/Zur/Datei.ASC";
    $db_tab "daten2009";
    $colum "data";

    // Originaldatei öffnen (leserecht)
    $DataOld fopen($DatanameOld,"r");
     
     
    while(
    $oneline=fgets($DataOld,400)) {
    //var_dump($oneline);
          
    $pruefen mysql_query("SELECT * FROM ".$db_tab." WHERE ".$colum."='".$oneline."'") or die("Pruefen: ".mysql_error());
          
    //var_dump($pruefen);
          
          
    if(!mysql_num_rows($pruefen)) {
                       
    $eintrag "INSERT INTO ".$db_tab." (".$colum.") VALUES ('".$oneline."')";
                    
    $eintragen mysql_query($eintrag) or die("Eintrag: "mysql_error());     
          } 

    Bei der kleinen funktioniert es wieder ohne Probleme, sobald ich aber mehr Datensätz habe kommt folgende Meldung:

    Pruefen: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 1
    Womit ich nichts anfangen kann, wenn 'hier nix steht'
    Aber es kommt ab der 820 Zeile vor (es ist egal was dort steht, ich denke es liegt an der Menge)

    Bei der großen Datei passiert etwas was ich nicht versteh:
    Lese die Daten mit dem oben genannten Script in die DB, dann erstellt er alle ID's aber in der Spalte ($colum = "data") steht nix, nur in der ersten Zelle.
    Aber leider nicht richtig, es sollte folgendes drin stehen:

    RN09999999999 usw....
    Und folgendes steht drin:
    ÿþR
    (in der Zeichencodierung: ISO-8859-15 oder US ASCII)
    in Unicode erscheinen nur die Fragezeichen in einer Route.

    In der Datei sind keine Zeichen vor RN0999....
    Woher kommen diese 2 komischen Zeichen, wobei sie mir nicht neu sind, ich hatte sie vor einem Jahr schon mal bei einer Funktion, nur ich weiß nicht mehr wie ich das Problem damals behoben habe.

    Würde es etwas bringen, die Datei zu splitten?
    In dem ich sage lese Zeile 0 bis 800 ein, lösche sie anschließend aus der Datei und beginne erneut, bis keine Datensätze mehr vorhanden sind???


    Ich hoffe jemand kann mir einen Rat geben und mir helfen, ich weiß wirklich nicht weiter.
    Schon mal vielen Dank im Voraus.

    Lg

  • #2
    Ich vermute, es liegt nicht an der Menge, sondern daran, dass vermutlich im Text Anführungszeichen stehen. Diese müssen maskiert werden, und dazu hat PHP auch eine Funktion.
    Ausserdem verstehe ich nicht, was es in so einem Fall bringen soll, Tabellen- und Attributnamen in Variablen zu schreiben.
    PHP-Code:
    $DatanameOld "Pfad/Zur/Datei.ASC";
    $DataOld fopen($DatanameOld"r");
     
    while (
    $oneline fgets($DataOld,400)){
        
    //var_dump($oneline);
        
    $sql "
            SELECT
                COUNT(*)
            FROM
                daten2009
            WHERE 
                data = '" 
    mysql_real_escape_string($oneline) . "'";
        
    $pruefen mysql_query($sql) or die("Pruefen: " mysql_error());
        list(
    $anzahl) = mysql_fetch_row($pruefen);
        if(
    $anzahl == 0){
            
    $eintrag "
                INSERT INTO
                    daten2009(
                        data
                    ) 
                    VALUES (
                        '" 
    mysql_real_escape_string($oneline) . "'
                    )"
    ;
            
    $eintragen mysql_query($eintrag) or die("Eintrag: " mysql_error());     
        } 

    Kommentar


    • #3
      Es sind wirklich keine Zeichen vor dem Datensatz, habe es trotzdem getestet, leider ohne Änderung.
      Auch trim() oder Ähnliches bringt nix, da steht wirklich nichts davor. Kopiere ich Datensätze von der Großen in meine kleine klappt es?
      Da muss irgendwas schief laufen...

      Ich habe die gesamte große Datei eingelesen, unter PHPmyAdmin sehe ich in der Übersicht das manche Positionen einen Eintrag erhalten:

      1 - ÿþRN09999999-64295389999999

      klick ich auf bearbeiten steht da nur ÿþR drin.

      Und es geht ganz unregelmäßig weiter:

      1 - ÿþR
      18 - A
      20 - A
      22 - A
      62 - A
      138 - G
      usw....
      (die Datensätze dazwischen sind leer)

      Und die Spalte ist als Text formatiert und fasst auch 400 Zeichen (sonst klappte es ja immer)

      Kommentar


      • #4
        Hast du nun einen SQL-Fehler oder nicht. Mein Beitrag bezug sich im Moment nur auf diesen.

        Kommentar


        • #5
          Licht am Ende des Tunnels
          @lazydog, ne mit SQL ist eigentlich alles schick!

          Ich arbeite nur mit ASC-Datein, aber jemand hatte die relevanten Daten mal in Excel importiert (nur eine Spalte), da wollte ich die alten Daten immer mit speichern als herausbekommen (und da muss dieser, wenn auch nicht sichtbare Fehler entstanden sein)
          Also habe alles markiert und kopiert (die Zwischenablage hat ganz schön gekämpft )
          So nun habe ich alle Datensätze wenigstens in einer Ordentlichen ASC-Datei.
          JUHU
          Aber zu früh gefreut, meine Daten werden perfekt in die DB eingelesen, aber leider stoppt er nach 14.000 Datensätzen? Ist irgendwo ein Maximum deklariert, welches ich hochsetzten muss?
          So ich habe die Daten einmal neu aus einer Excel-Datei kopiert

          Kommentar


          • #6
            Zitat von Jacke Beitrag anzeigen
            Aber zu früh gefreut, meine Daten werden perfekt in die DB eingelesen, aber leider stoppt er nach 14.000 Datensätzen? Ist irgendwo ein Maximum deklariert, welches ich hochsetzten muss?
            Vermutlich: PHP: Laufzeit-Konfiguration - Manual

            Kommentar


            • #7
              Ganz genau:
              ini_set("max_execution_time", "600"); // 10 Minuten

              ergab schon mal 47,391 Datensätze, ich stell das auf 20 dann sollten meine 70.000 Daten endlich drin sein. Wahnsinn, hätte nie gedacht das es so lange dauern kann.

              Kommentar


              • #8
                ini_set('max_execution_time', 0); // unendlich

                Kommentar


                • #9
                  Na das sollte reichen, danke für den Parameter

                  Kommentar


                  • #10
                    Zitat von yab Beitrag anzeigen
                    ini_set('max_execution_time', 0); // unendlich
                    Das kann man so pauschal aber nicht unbedingt überall machen, da kann es unter Umständen zu Problemen mit dem Provider kommen, viele sehen das nicht gern und lassen diese Einstellung so nicht zu, da sollte er sich mal mit seinem Provider in Verbindung setzen.

                    Kommentar


                    • #11
                      Danke für den Hinweis, jedoch besteht die Gefahr nicht. Ich arbeite auf dem eigenen Webserver, welcher nur in unserem Netzwerk freigegeben ist!
                      Stresst den Server ja auch ganz schön, wenn 100 Kunden ein stundenlanges Script ausführen!

                      Kommentar

                      Lädt...
                      X