Daten vergleichen db <-->txt-file

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

  • Daten vergleichen db <-->txt-file

    Hallo ,

    ich möchte Daten die in einer Tabelle stehen mit Daten die ich aus einer txt- Datei filtere vergleichen.

    Ich bekommen ein Array aus der txt-Datei. Die Daten in DB sind die Stammdaten.
    Ich möchte wissen welche Eintrag in der txt- Datei fehlt, wohl aber in der Tabelle der DB steht.


    Ich bekomme ein Array aus der txt- Datei und aus der DB.
    Wenn ich diese direkt miteinader vergleiche wird erste Eintrag, der sowohl in txt-Datei und in der DB steht, herausgefiltert. Ist also ok.
    Nur wird die Filterung aber weiter fortgesetzt und sämtliche andere Einträge in der DB werden als fehlend herausgeworden.

    Es sollte aber so sein das er nach gefundenen Eintrag zum nächsten übergeht, weil ist ist ja gefunden.

    Wo ist mein Denkfehler?

    Code:
    <?php
    
            function vergleich($str)
            {  
             global $w;
            $txt1 = preg_split('/_/', $str, -1, PREG_SPLIT_DELIM_CAPTURE);
            echo "str =$str<br>";
    
       print_r($txt1); //testausgabe
    
    //Hier die Daten zur Datenbankverbindung!
        include ('C:/programme/xampp/htdocs/xxxxprog/func/db_connect.tpl.inc');
              
        $sql = "SELECT namehost FROM dasi"; // where namehost = '$txt1[0]'
        $result = mysql_query($sql) or die(mysql_error());#
    
        $w=0;
        while(!$row = mysql_fetch_assoc($result))
      
                {
                
                {
                echo "Dieser wurde nicht gesichert $txt1[0]<br>";
                $w++;
                break;
                }
             
                }  
             }     
    ?>
    Die ist der Funktionsbaustein der diese Funktion ausführen soll
    Ideen?

    Thx
    Speedy(g)

  • #2
    welche form haben die daten? zeig mal ein beispiel bitte.

    evtl. lässt sich das viel eleganter lösen.

    Kommentar


    • #3
      Also die Daten aus der txt-Datei sehen folgendermaßen aus:

      bsb: klk09002_12.tib

      Aus dieser Zeile wird klk09002

      In der txt- Dateien sind ca. 100 solcher einträge die dann verglichen werden sollen.

      Die DB Einträge sehen genauso aus wie die txt-Einträge.

      Als Ergebnis kommt dann zur Zeit erster Eintrag wird nicht angezeigt , wenn erster Einttrag in der Db auch klk09002 ist.Dann aber 99 mal klk09002 ist nicht in der txt Datei.

      Für eine elegantere Lösunf wäre ich sehr dankbar. Ich habe es auch schon mit "in_array" etc. probiert aber nie das gewünschte Ergebnis erhalten.

      Vielleicht noch der Vollständikeit halber:
      Diese Funktion wird aus einer anderen Funktion aus aufgerufen. Diese vorherige Funktion filtert aus der besagten txt- Dateien Datum etc. heraus.

      Kommentar


      • #4
        1. fülle ein array mit den daten aus der txt-datei:

        PHP-Code:
        $arr = array('klk09002''klk09003''klk09004' /* ... */); 
        2. frage die datenbank ab:

        Code:
        SELECT ... FROM ... 
           WHERE `feld` NOT IN (hier alle elemente von $arr, schön kommagetrent)
        3. die markierten datensätze sind genau diejenigen, die in der txt-datei nicht vorliegen, aber in der datenbank abgelegt sind.

        Kommentar


        • #5
          mmh,

          müßen die Datensätze komma getrennt sein ?

          Ich bekomme ja scho ein Array übergeben und zwar in der Variable "$txt1"

          (hier alle elemente von $arr, schön kommagetrent)
          heißt das das da einfach nur $txt1 hien muss?

          Kommentar


          • #6
            es geht um die syntax von "... IN (...)":

            z.b.
            Code:
            ... IN ('apfel', 'birne', 'bremsflüssigkeit')

            Kommentar


            • #7
              Soweit verstanden - Denke ich .

              ich kann also in die Klammer nach dem in keine Array schreiben ($txt1)?

              SELECT namehost FROM dasi where namehost not in ($txt1);

              richtig oder falsch?

              In die Klammer muss ich ja dynamisch schreiben weil sich die Daten aus der txt- Datei ändern.

              Kommentar


              • #8
                falsch.

                lass dir eine solche query ausgeben und du siehst, warum.

                Kommentar


                • #9
                  Tja , ähh ich glaube es ist zu heiß heute für so etwas.

                  Ich habe es jetzte zwar ausprobiert aber da kommt dann garnichts.

                  Gib mir doch bitte nochmal einen zusammhängenden Hinweis.
                  Ist wahrscheinlich ganz einfach aber ich sehe es im Moment nicht.

                  Thx

                  Kommentar


                  • #10
                    PHP-Code:
                    # sei $arr wie oben von mir gefüllt.
                    # nun:

                    $s '';
                    foreach (
                    $arr as $el)
                    {
                       
                    $s .= "'".$el."',";
                    }

                    # das letzte überflüssige komma abschneiden

                    echo $s# ergibt genau das, was dem operator IN übergeben werden soll 

                    Kommentar


                    • #11
                      Ja danke.

                      Zum verständniss:

                      - $arr wäre in dem Fall das was bei aus der txt-Datei kommt .

                      - Wird dann in $s geschrieben der wiederum dann den Sql befüllt an der Stelle an dem der Name abgefragt wird .

                      oder muss in dem SQL Befehl der ganze Inhalt des $arr

                      Vielleicht nochmal eine kleine Erläuterung. ich möcht das halt zu 100% verstehen.

                      Kommentar


                      • #12
                        Ich habe das Anfangsproblem gelesen. Ich würde die Textdatei in ein Array einlesen und dann sortieren.
                        Danach kannst du eine gleich sortierte Query aus der Datenbank machen.
                        Dann machst Du eine while-Schleife über das query-Resultat und führst gleichzeitig einen Index auf den array nach.

                        in der while-Schleife ist die Abfrage:
                        if($i>=laenge($array)
                        {mache eines}
                        elseif ($row['feld']>$array[$i]
                        {mache eines}
                        elseif($row['feld']==$array[$i]
                        {mache anderes}
                        elseif($row['feld']<$array[$i]
                        {mache drittes}

                        Dann braucht es noch den Fall, dass der array länger ist und die whileschleife schon zu Ende:
                        while($i<laenge($array)
                        {mache drittes}

                        Etwa so.

                        Ich merke gerade, dass das noch nicht ganz richtig ist, das heisst von der Idee her schon.
                        Zuletzt geändert von h31ss; 23.07.2006, 19:42.

                        Kommentar


                        • #13
                          Wenn ich recht begriffen habe, sind die gesicherten Dateien in einem string $txt1 aufgeführt.

                          Am einfachsten ist es, wenn man eine query auf die Datenbank machst,
                          in der while-Schleife macht man ein strstr($row['feld'],$txt1) und bekommt die fehlenden Sicherungen heraus, eine um die andere. falls $txt1 nicht ein string sondern ein array ist, ist natürlich in_array($row['feld'],$txt1) die richtige Abfrage.

                          Mein früherer Vorschlag wäre vorteilhaft, dass strstr nicht jedesmal das ganze $txt1 absuchen muss. Aber bei 100 Einträgen spielt das kaum eine Rolle, (100 Vergleiche anstatt 5000 Vergleiche).
                          Zuletzt geändert von h31ss; 23.07.2006, 20:09.

                          Kommentar


                          • #14
                            h31ss - erster vorschlag ist ineffizient, der zweite trifft nicht ganz zu.
                            $arr wäre in dem Fall das was bei aus der txt-Datei kommt .
                            denke schon.
                            Wird dann in $s geschrieben der wiederum dann den Sql befüllt an der Stelle an dem der Name abgefragt wird .
                            ja (soweit ich es verstanden habe. die grammatik lässt grüßen).
                            oder muss in dem SQL Befehl der ganze Inhalt des $arr
                            und was denkst du, was $s anschließend enthalten wird?

                            Kommentar


                            • #15
                              Original geschrieben von penizillin
                              h31ss - erster vorschlag ist ineffizient
                              Warum sind 5000 Vergleiche ineffizient?
                              Du hast vermutlich gut aufgepasst bei Algorithmen, aber schlecht bei Organisation von Datenverarbeitungssystemen.

                              Kommentar

                              Lädt...
                              X