Ich benötige einen Denkanstoss beim kopieren von Dateien

  • Hallo zusammen, meine Idee /Problem..

    Ich würde gerne eine csv Datei einlesen, der Inhalt der Datei ist eine Auswahl an Fotos zb. img01.jpg , img02.jpg, img121.jpg .
    Diese Dateien würde ich gerne von einer Freigabe kopieren zu einem Ort den ich in meinem Script angebe.

    Jetzt das Problem : Die Datei img01.jpg ist vielleicht in einem anderen Verzeichnis wie die Datei img121.jpg

    Ich müsste wohl erst eine Suche machen, wo ist die Datei / sind die Dateien, dann die Pfade einlesen und dann kopieren zu einen gemeinsamen Pfad den ich dann in Script als Eingabefenster eintrage.

    Nur wieeeeee?
    Für Hilfe wäre ich sehr dankbar, da ich bisher nur kleine Scripts geschrieben habe und mich mit Array zum kopieren nicht so auskenne.
    Danke

  • Hi @Dreamworker

    Mit dem Auslesen der csv hast du jetzt kein Problem, oder? Du hast also nur den Dateinamen und musst die Datei suchen. Da bietet sich _FileListToArrayRec an. Solange nicht mehrfach die gleichen Dateinamen auf dem Computer hast, kein Problem. Ansonsten.. ;)

    Grüße autoiter

  • Ich denke das Einlesen der csv bekomme ich vielleicht hin.

    Mir ist nur nicht ganz klar wie ich FilelisttoArrayRec einsetzen kann.

    ich denke es wird dann im Array sowas drin stehen wie:

    c:\unterordner1\unterordner2\img1.jpg
    c:\unterordner2\img23.jpg
    c:\unterordner\unterordner\unterordner\img3.jpg

    Wie kann ich mit dem Inhalt weiter arbeiten?

  • Upps jetzt bin ich überfordert.

    Ich denke als erstes so etwas
    Und die Filterdatei enthält die Info IMG, denn alle Dateien enthalten im Namen IMG.


    • #include <file.au3>
    • #include <array.au3> ; wird nur für _Arraydisplay am Ende gebraucht! kann dann eventuell entfernt werden
    • Global $arresult [1], $ardatei, $arfilter
    • $file = "C:\test.csv" ; einzulesende csv Datei
    • $filter = "C:\meinfilter.txt" ; einzulesende Filterdatei


    Danach dann FilelisttoArrayRec ? oder ArrayFindAll

    Sorry mit den Array bin ich nicht so fit

  • Nein eigentlich brauchst du keine Filterdatei. Ich sehe auch nicht, dass das sinnvoll sein kann. Filter kannst du auch bei _FilelisttoArrayRec mitgeben..

    Du machst damit einmal eine Suche in dem Bereich, in dem deine Bilder liegen können und speicherst das in einem Array.
    Dann gehst du in einer Schleife deine Einträge aus der csv durch und suchst die im Arrray.

    Beispiel
    Eintrag aus csv: img23.jpg

    (Dein Array:)
    c:\unterordner1\unterordner2\img1.jpg
    c:\unterordner2\img23.jpg
    c:\unterordner\unterordner\unterordner\img3.jpg

    Da wird dir bspw. bei _ArraySearch und deinem Array der Indexwert (die Stelle im Array) ausgegeben, mit der du dann weiterarbeiten kannst. Dann hast du kompletten Pfad der Datei. Das kannst du dir erst einmal zwischenspeichern oder gleich deine gewünschte Kopie vornehmen.

    Grüße autoiter

  • Du sagst, die Dateien könnten in unterschiedlichen Verzeichnissen liegen... sind diese Verzeichnisse Unterverzeichnisse oder sind sie verstreut auf verschieden Pfaden/Partitionen?

    Ich mache solche Aktionen gerne mit Everything... bzw. mit dem Komandozeilen-Tool es.exe, dass du auch auf dieser Seite findest.

    Beispiel:
    > es.exe -h
    -r Search the database using a basic POSIX regular expression.
    -i Does a case sensitive search.
    -w Does a whole word search.
    -p Does a full path search.
    -h --help Display this help.
    -n <num> Limit the amount of results shown to <num>.
    -s Sort by full path.

    ; alle Bilder aus dem Verzeichnis "f:\Eigene Dateien\Pictures\Fun\" inkl. aller Unterverzeichnisse nach Bildern durchsuchen, die mit "img" beginnen und mit ".jpg" enden
    > es.exe -p "f:\Eigene Dateien\Pictures\Fun\*img*.jpg"
    F:\Eigene Dateien\Pictures\Fun\Fun - JPG\Ichhasseallekriminellen.jpg
    F:\Eigene Dateien\Pictures\Fun\Fun - JPG\Katzenfalle.jpg
    F:\Eigene Dateien\Pictures\Fun\Fun - Linux\linux_users_what_i_really_do.jpg
    ...


    oder die Ausgabe direkt in eine Datei umleiten...

    > es.exe -p "f:\Eigene Dateien\Pictures\Fun\*img*.jpg" >> c:\pics.txt


    Alternativ kannst du natürlich auch es.exe via AutoIt starten und die Ausgabe von Stdout in ein Array einlesen...


    es_example


    es_example.png

  • Vielen Dank Autoiter,

    ich muß mich mal heute Abend in die Array Thematik knien, um mal zu sehen wie und was in so einem Array ankommt, damit ich es besser verstehe.

    Könntest Du mir vielleicht kurz zwei Zeilen schreiben wie ich die csv einlese und dann danach suche.

    Mein Ansatz :

    • #include <file.au3>
    • #include <array.au3> ; wird nur für _Arraydisplay am Ende gebraucht! kann dann eventuell entfernt werden
    • $file = "C:\test.csv" ; einzulesende csv Datei

    und dann ?

  • Hey Bitnugger, genau so habe ich es vor, ich lese die CSV ein habe dann genau alle Bildernamen.
    Dann suche ich nach den Bildernamen und erzeuge ein Array ( alle Bilder liegen auf einer Partition)
    Danach muss ich nur noch einen Kopierjob starten, der es zulässt, dass ich das Ziel des Kopierjobs angebe. ( Ziel ist ein einziger Ordner)

  • Auch für die csv wären Arrays von Vorteil..
    Leider kann ich dir nicht sicher helfen, weil ich hier in letzter Zeit gelernt habe, wie vermurkst csv-Dateien sein können.
    Wenn es in etwa so ausschlaut:

    img1.jpg;img2.jpg;img99.jpg
    img11.jpg;img15.jpg

    Dann würde ich es mit FileRead einlesen und das Ergebnis mit StringSplit (Semikolon als Trennzeichen) in ein Array splitten.

    Grüße autoiter

  • Die CSV ist immer gleich.
    Ich brauche genau immer die Datei, die bei Sterne eine 1 stehen hat.

    Nummer Galerie Dateiname Sterne Rot Grün Blau Lila Schwarz Bemerkungen
    1 zur Auswahl 2016-SUN-04050 1 0 0 0 0 0
    2 zur Auswahl 2016-SUN-04051 0 0 0 0 0 0
    3 zur Auswahl 2016-SUN-04052 0 0 0 0 0 0
    4 zur Auswahl 2016-SUN-04053 0 0 0 0 0 0
    5 zur Auswahl 2016-SUN-04054 1 0 0 0 0 0
    6 zur Auswahl 2016-SUN-04055 0 0 0 0 0 0
    7 zur Auswahl 2016-SUN-04056 0 0 0 0 0 0
    8 zur Auswahl 2016-SUN-04057 1 0 0 0 0 0
    9 zur Auswahl 2016-SUN-04058 0 0 0 0 0 0
  • Das sollte dir die beiden Arrays geben :) :

    EDIT: Hab grad die zwischenzeitlichen Antworten gelesen und das entsprechend ergänzt :)


    Habs nen bisschen Kommentiert :)

    Das Pattern (.*?)img(.*?)\.jpg$ findet alle Dateien die Folgendem entsprechen: irgendwas (.*?) gefolgt von img gefolgt von irgendwas gefolgt von einem .jpg
    Das $ sagt, dass das .jpg am Ende stehen muss. Soll das img am Anfang stehen kannst du das erste (.*?) weglassen.

    MfG Kanashius

  • Ist es richtig wenn ich die Namen mit folgenden werten raussuche ?

    $result=StringRegExp($arTmpFiles[$i],"\SUN*"&$sDelimeter&"(?:.*?)"&$sDelimeter&"(.*?)"&$sDelimeter&"(\d*)"&$sDelimeter,1);Den Namen und den Stern auslesen

    Denn irgenwie findet er die Dateinamen nicht.

  • \d steht für eine Zahl, das * dafür, dass es beliebig viele sind. Also wird dort die erste Spalte mit der Nummer gesucht.Die Spalten werden durch $sDelimeter getrennt. Dort musst du unbedingt das Trennzeichen der Spalten in der CSV-Datei angeben (Momentan TAB, kann aber auch ; sein. Einfach die CSV mit notepad oder ähnlichem aufmachen und nachsehen.)

    Richtig wäre also:
    "\d*"&$sDelimeter&"(?:.*?)"&$sDelimeter&"\d{4}-SUN-(.*?)"&$sDelimeter&"(\d*)"&$sDelimeter

    \d{4}-SUN-(.*?) sucht nach 4 Zahlen gefolgt von -SUN-. Alles danach in der Spalte wird dann genommen.

    Du musst UNBEDINGT das Trennzeichen wissen und bei $sDelimeter=@TAB zuweisen.

    PS:
    Dein Pattern findet folgendes:
    "\SUN*"&$sDelimeter&"(?:.*?)"&$sDelimeter&"(.*?)"&$sDelimeter&"(\d*)"&$sDelimeter
    Ein nicht Whitespacebuchstaben gefolgt von U gefolgt von beliebig vielen N -NEUE SPALTE- irgendwas, ohne match -NEUE SPALTE- irgendwas -NEUE SPALTE- beliebig viele Zahlen -NEUE SPALTE-

  • Hallo zusammen, bin schon super weit gekommen, die Datei wird eingelesen und auch alle Dateien mit Stern richtig ausgewertet.

    Er findet sogar die Pfade der Dateien, diese werden in der Console ausgegeben.
    2016-SUN-03939 -> s:\2016\2016-12-05\2016-SUN-03939.nef
    2016-SUN-03940 -> s:\2016\2016-12-05\2016-SUN-03940.nef
    2016-SUN-03960 -> s:\2016\2016-12-05\2016-SUN-03960.nef
    2016-SUN-03962 -> s:\2016\2016-12-05\2016-SUN-03962.nef

    wie bekomme ich es hin, das Autoit genau die gefunden Übereinstimmungen kopiert?

    Hier meine Idee dazu, die aber so nicht funktioniert, da ich nicht weiß wie ich die Consolenergebnisse abfrage .

    $input1 = InputBox ("Zielpfad eingeben")

    $gefundeneDateien = ???? meine gefunden Dateien??? ( oben z.b. s:\2016\2016-12-05\2016-SUN-03939.nef)
    ;Dateien auf Server sichern.
    DirCopy("$gefundeneDateien" "$input1")

  • if $index>-1 then;Wenn gefunden ausgeben
    ConsoleWrite($arFiles[$i]&" -> "&$arSearch[$index][0]&@crlf)
    endif

    die brauchst du nicht auslesen. Ich lasse nur die variablen in der schleife ausgeben. Du kannst das consolewrite dort wegnehmen und die variablen anderweitig nutzen. Also in der for-schleife.
    $arFiles[$i] ist der name der erst ausgegeben wird und
    $arSearch[$index][0] ist der pfad+dateiname der gefunden wurde
    $arSearch[$index][1] ist der dateiname der gefunden wurde

    Also FileCopy($arSearch[$index][0],$input1&"\"&$arSearch[$index][1])
    Statt der inputbox kannst du auch fileselectfolder nutzen ;)

  • Scheint doch noch ein kleiner Bug drin zu sein, wenn der Browser der die CSV Datei erstellt englisch ist z.b. vom Handy
    Dann sieht die CSV auch anders aus. Dann klappt es irgendwie nicht.

    Ich denke es liegt an der Zeile :

    $result=StringRegExp($arTmpFiles[$i],"\d*"&$sDelimeter&"(?:.*?)"&$sDelimeter&"(.*?)"&$sDelimeter&"(\d*)"&$sDelimeter,1);Den Namen und den Stern auslesen

    Habe versucht sie zu verstehen aber da bin ich noch zu sehr Anfänger..

    englische Version

    Number Gallery Filename Stars Red Green Blue Purple Black Comments
    1 zur Auswahl 2016-SUN-03758 1 0 0 0 0 0

    deutsche Version

    Nummer Galerie Dateiname Sterne Rot Grün Blau Lila Schwarz Bemerkungen
    1 zur Auswahl 2016-SUN-03938 1 0 0 0 0 0


    Ich finde nur nicht den Unterschied bei der Abfrage auf Stern.