Rufinus: PERL - OFF TOPIC :)

Ich versuche, ich suche... finde nicht, schaff es nicht also brauch ich euch :)

und zwar eine Vergleichsroutine :)

zwei verzeichnisse, in dem einem liegen *.zip in dem anderen *.jpg, die beiden sollen verglichen werden ...es sollen immer matches gefunden werden, die in eine datei geschrieben werden, solche datein die nicht übereinstimmen sollen in ein errorlog kommen....

soweit zur erklärung:
das problem:

bis jezt machte ich es so, eine datei wird mit der ganzen liste des anderen verzeichnisses verglichen, das ging auch wunderbar, bei 0-200 Datein, aber jetzt sind es über 1000 datein...und da dauert der spaß an die 3 stunden!!!! :)

was ich brauche wäre eine gute routine die das etwas schneller macht :) irgendein sortieralgorythmus oder eine andere Technik, mir fällt nichts mehr dazu ein wie ich es beschleunigen könnte.

Danke im Voraus
Rufinus

  1. Hi,

    was wird verglichen, der Dateiname oder der Dateiinhalt? Entzippst Du vorher, oder ist das nur eine andere Endung für ein normales jpg?

    Cheatah

    1. Hi,

      was wird verglichen, der Dateiname oder der Dateiinhalt? Entzippst Du vorher, oder ist das nur eine andere Endung für ein normales jpg?

      Cheatah

      der Dateiname, die sollten gleichsein bis auf die eindung, im einen verzeichniss liegen zipfiles, im andern jgp files

      Rufinus

      1. Hi,

        was wird verglichen, der Dateiname oder der Dateiinhalt? Entzippst Du vorher, oder ist das nur eine andere Endung für ein normales jpg?

        Cheatah

        der Dateiname, die sollten gleichsein bis auf die eindung, im einen verzeichniss liegen zipfiles, im andern jgp files

        Rufinus

        Wie schaut denn Deine langsame Lösung genauer aus - was kostet denn soviel Zeit

        Jörk

        1. Hi,

          was wird verglichen, der Dateiname oder der Dateiinhalt? Entzippst Du vorher, oder ist das nur eine andere Endung für ein normales jpg?

          Cheatah

          der Dateiname, die sollten gleichsein bis auf die eindung, im einen verzeichniss liegen zipfiles, im andern jgp files

          Rufinus

          Wie schaut denn Deine langsame Lösung genauer aus - was kostet denn soviel Zeit

          Jörk

          Lade beide Verzeichnisse - nimm ersten eintrag, vergleiche mit erstem eintrag der zweiten liste -  wenn gefunden - schreibe in array - else -vergleiche mit zweitem eintrag der zweiten [...] liste-wenn gefunden schreibe in array - else - schreibe in array ERROR-nimm nächstes file.....

          und da liegt das problem, wenn er es mit 200 files macht, no prob. aber den namen mit >1000 files vergleichen dauert eben, und darum frage ich ob es eine schnellere alternative dazu gibt.

          Ich hab leider den source code nicht hier in der arbeit, aber ich kann ihn am abend posten wenns sein muß :)

          Rufinus

          1. Hi Rufinus!

            Ich hab zwar im Moment kein perl zu Hand...
            Jedoch gibt es IMHO in Perl eine Sort-Funktion!
            Daher mein Vorschlag... :

            Lade erst die Namen der .jpg-Dateien und dann dahinter
            die Namen der .zip-Dateien in EIN einziges Array.
            Die Dateiendungen müssen dabei jeweils mit ins Array übernommen werden.
            Dann sortiere dieses eine Array mit der eingebauten sort-Funktion.
            Falls das irgendwie nicht gehen sollte oder zu lange dauert (hab keine Erfahrung
            damit), dann versuch' irgendwo im Web eine quicksort-Routine zu finden.

            Ergebnis: Die jetzt gleichen Dateien stehen im großen Array unmittelbar
            hintereinander. Einmal mit .jpg und einmal mit .zip. Du brauchst also nur noch
            einmal das Array durchlaufen und alle diese Paare herauszufiltern.

            Viele Grüße!

            Andreas

            1. Hi,

              mach es doch einfach so:
              Lies das erste Verzeichnis in ein Array @temp. Dann:

              foreach $foo (@temp) {
                 $test{(split(/./,$foo))[0]}++;
              }

              Danach prüfst Du mit dem zweiten Verzeichnis nur mit allen $Namen in einer einfachen for-Schleife:

              if ($test{(split(/./,$Name))[0]}) { &dosomething; }

              Das sollte genügen! Ähnliche Dinge mache ich gerade mit mehreren 1000 Zeilen Logfile bei meinem Counter, und es dauert nur ein paar Millisekunden.

              Cheatah