Dateinamen vergleichen

  • Hallo zusammen,

    und erst mal eine schöne Adventszeit.:)

    Ich habe eine Frage zum oben stehenden Thema. Kleine Ergänzung: Ich möchte nur die ersten 6 Zeichen von Dateien vergleichen.

    Die Dateien liegen einmal in einem Ordern "Source" und einmal in "Dest". Nun möchte ich von beiden Pfaden, von jeder Datei die ersten 6 Zeichen miteinander vergleichen. Bei Gleichheit soll dann eine MsgBox erscheinen, die Datei im Ordner "Dest" anzeigt.

    Hier mal das was ich bis jetzt habe:


    Ich stehe leider auf dem Schlauch, wie ich das alles abarbeiten soll.

    Könntet Ihr mir da mal helfen?:)

    Danke im Voraus.

    LG Mikki

    Probleme kann man niemals mit derselben Denkweise lösen, durch die sie entstanden sind.

    Einmal editiert, zuletzt von Mikki (4. Dezember 2017 um 14:08)

  • Hallo Mikki,

    das funktioniert wohl eher nicht:

    Code
    For $i = 1 To UBound($aFileList_Source & $aFileList_Dest)

    Nimm da Ubound von deinem Source-Array.

    Dann suche jede Datei im Source-Array mit dem jeweiligen String, den du nutzt im Dest-Array. (StringLeft($aFileList_Source[$i], 6)).

    Dazu kannst du _ArraySearch (im Compare-Mode) nutzen.

    Grüße autoiter

  • Hallo zusammen,

    danke für die Antwort autoiter. Ich habe das jetzt mal so übernommen:


    Allerdings kommt dann diese Meldung hier: ==> Array variable has incorrect number of subscripts or subscript dimension range exceeded.:

    $Plannummern_Dest = StringLeft($aFileList_Dest[$i], 6)

    $Plannummern_Dest = StringLeft(^ ERROR


    Bei dem Errorhandling von $Vergleich tritt dann der Fehler 1 auf. bei _Arraysearch heißt 1: $aArray ist kein Array

    Wo liegt denn das Problem? Es ist doch durch _FilelisttoArray als Array eingelesen?!.

    Probleme kann man niemals mit derselben Denkweise lösen, durch die sie entstanden sind.

  • Ubound gibt die Anzahl der Elemente zurück. Das Array ist nullbasiert. Daher ist das letzte Element die Anzahl minus 1.

    $Plannummern_Dest = StringLeft($aFileList_Dest[$i], 6) - 1

    Grüße autoiter

  • Hilft leider auch nicht. Noch eine Idee?

    Ein weiteres Problem: meine Dateien fangen beispielsweise mit 2800-0 im Dest Ordner an. Wenn ich im Source Ordner 2800-1 schreibe, findet er trotzdem eine Übereinstimmung un gibt weiterhin eine Fehlermeldung aus. Die Meldung in der Konsole besteht weiterhin.

    Probleme kann man niemals mit derselben Denkweise lösen, durch die sie entstanden sind.

  • Ja, sorry. Ich habe die falsche Zeile kopiert. Es geht natürlich um die For .. Zeile mit dem Ubound.

    For $i = 0 To UBound($aFileList_Source) - 1. Da muss die minus Eins hinein. :D

    Für die andere Frage zeige mal deine Suche, bitte. (Edit: Ist ja da..).

    Grüße autoiter

  • Du musst für alle Einträge des einen Arrays im anderen Array suchen. Das kannst du mit _ArraySearch machen, oder du schreibst selbst noch einmal eine Schleife in der du deinen Suchstring mit allen Elementen aus dem zweiten Array vergleichst.

    EDIT: ArraySearch im Compare-Mode war eine dumme Idee. Würde dich vllt. nicht treffen, aber hier würdest du nicht nur die ersten sechs Zeichen aus dem Dateinamen vergleichen. Versuche es mal mit diesen beiden Schleifen.

    Grüße autoiter

    Einmal editiert, zuletzt von autoiter (4. Dezember 2017 um 16:15)

  • ArraySearch im Compare-Mode war eine dumme Idee

    Nicht unbedingt : Setzt man das Flag $iCompare auf 1, führt _ArraySearch auch eine Teilsuche aus.

    Gruß Musashi

    86598-musashi-c64-png

    "Am Anfang wurde das Universum erschaffen. Das machte viele Leute sehr wütend und wurde allenthalben als Schritt in die falsche Richtung angesehen."

  • Hallo,

    erstmal vielen Dank für eure Mühen. Die Lösung von autoiter funktioniert genauso wie es sein soll.

    Musashi : autoiter hat Recht. Hab´s gerade probiert. Wenn ich aus 2803-0 eine 2803-1 mache, zeigt er die trotzdem als Übereinstimmung an.

    Wenn ich aus StringLeft ein StringMid mache, funktioniert es. Da durchsucht er ja die ersten 6 Zeichen.

    Vielen lieben Dank euch zwei. So kann ich nun weiter machen.:)

    LG Mikki

    Probleme kann man niemals mit derselben Denkweise lösen, durch die sie entstanden sind.

  • Hallo autoiter und Mikki !

    Ich persönlich ziehe die Lösung mit den 2 Schleifen hier auch vor !

    Aus Interesse (nicht aus Rechthaberei ^^) wollte ich aber mal wissen, ob es auch mit _ArraySearch geht.

    autoiter : In deinem Beitrag #8 gibt es eine kleine Macke (ist mir auch nur zufällig aufgefallen ;)) :

    AutoIt
    For $i = 0 To UBound($aFileList_Source) - 1
            $Plannummern_Source = StringLeft($aFileList_Source[$i], 6)
            For $ii = 0 To UBound($aFileList_Dest) - 1
    ... usw.

    Falls die Anzahl der Dateien im SourceDir und im DestDir identisch sind, dann wird auch der Index [0] der Arrays (Anzahl der Elemente) verglichen und als Treffer gewertet. Die Schleifen müssen also bei 1 starten, nicht bei 0.

    Das Ziel von Mikki ist es ja zu prüfen, ob Dateien in beiden Verzeichnissen vorkommen, die die Bedingung :

    -> die ersten x Charakter sind identisch (hier x=6)

    erfüllen. (Hinweis : die Macke mit 0 als Startwert im Vergleich 2 habe ich noch so gelassen)

    Enthält das DestDir die Datei 2008-2002.txt , dann melden beide Vergleiche einen Treffer. Benennt man diese Datei z.B. in 2008-7002.txt um, dann nicht. Ich habe den o.a. Code und zwei Beispielverzeichnisse mal angehängt.

    Möglicherweise ist mein Kopf aber auch nur noch in einer Fehlerschleife gefangen - war ein langer Tag ^^

    Gruß Musashi

  • Danke Musashi für deine Aufmerksamkeit. :)

    Das habe ich verpeilt, weil ich mich auf den Fehler beim Ubound im Ursprungsbeitrag konzentriert habe. Da kann ich dann wenigstens den Hinweis geben das Ubound hier völlig unnötig ist. Wieso die Anzahl der Elemente zeitaufwändig ermitteln, wenn man die Anzahl bereits kennt For $i = 1 To $aFileList_Source[0]

    Das andere trifft meines Erachtens den Kern nicht. Natürlich kann es sein, dass Mikki hier keine Probleme mit _ArraySearch hat. Es ist aus meiner Sicht aber einfach sinnfrei wegen sehr wenigen eingesparten Zeilen, einen bekannten Mangel in Kauf zu nehmen.

    2208-2 ist sowohl Teil von 2208-2002.txt als auch von abc2208-2002.txt als auch von 22208-2004.txt.

    Grüße autoiter

  • Hallo autoiter

    2208-2 ist sowohl Teil von 2208-2002.txt als auch von abc2208-2002.txt als auch von 22208-2004.txt.

    Meine Güte, bin ich blöd ! Den Fall, dass der Teilstring auch irgendwo in der Mitte sitzen darf, hatte ich so aus _ArraySearch gar nicht herausgelesen. Ich bin immer davon ausgegangen, dass der Vergleich mit dem ersten Zeichen beginnt und mich gefragt, wo denn bitte das Problem sei. Zu meiner Entschuldigung kann ich nur anführen, dass ich _ArraySearch bisher nie verwendet habe. Ich mag die händische Verarbeitung von Arrays i.d.R. eh lieber ^^. Na ja, danke, dann wäre das ja geklärt.

    Gruß Musashi

    86598-musashi-c64-png

    "Am Anfang wurde das Universum erschaffen. Das machte viele Leute sehr wütend und wurde allenthalben als Schritt in die falsche Richtung angesehen."

  • Hallo autoiter und Mikki !

    Nachtrag - nur der Vollständigkeit halber und ggf. für interessierte User ;):

    Die Anforderung von Mikki war :

    Im Zielverzeichnis ($sDestDir) nach Dateinamen zu suchen, die mit den ersten 6 Zeichen von Dateinamen aus dem Quellverzeichnis ($sSourceDir) übereinstimmen.

    Ich (und anfangs auch Du) bin von der Annahme ausgegangen, dass eine Teilstringsuche ($iCompare=1) am Anfang beginnt. Dem ist aber nicht so ! Sucht man z.B. nach 2208-2 , dann wird auch abc2208-2002.txt als Treffer gewertet. Was fehlt ist ein Parameter der festlegt, ob der Teilstring am Anfang, irgendwo oder am Ende stehen muss/darf.

    Es gibt aber die folgende, wenn auch wenig einsteigerfreundliche, Variante :

    Den Parameter $iCompare=3 verwenden, und den Teilstring als regulären Ausdruck angeben.

    Ersetzt man in meinem Beitrag #12 die Zeile 27 :

    $iVergleich = _ArraySearch($aFileList_Dest, $sPlannummern_Source, 0, 0, 0, 1)

    mit :

    $iVergleich = _ArraySearch($aFileList_Dest, '(?i)(^)' & $sPlannummern_Source, 0, 0, 0, 3)

    dann funktioniert es. Zur Info : '(?i)(^)' = (Groß/Kleinschreibung egal)(am Anfang)

    Das macht die Verwendung von _ArraySearch in diesem Fall aber auch nicht 'charmanter' ^^.

    Gruß Musashi

    86598-musashi-c64-png

    "Am Anfang wurde das Universum erschaffen. Das machte viele Leute sehr wütend und wurde allenthalben als Schritt in die falsche Richtung angesehen."

  • Hallo Musashi

    danke für den Tipp. Das wusste ich nicht. Wie du schon geschrieben hast, bin ich auch davon ausgegangen, dass die Suche am Anfang beginnt.

    Charmant hin oder her. Wenn´s denn funktioniert ^^

    Danke dir.

    LG Mikki

    Probleme kann man niemals mit derselben Denkweise lösen, durch die sie entstanden sind.