Neuigkeiten:

Wenn ihr euch für eine gute Antwort bedanken möchtet, im entsprechenden Posting einfach den Knopf "sag Danke" drücken!

Mobiles Hauptmenü

In großen Mengen Fotodateien mehrfach umbenennen und kopieren

Begonnen von ReneK, November 16, 2018, 11:21:24

⏪ vorheriges - nächstes ⏩

ReneK

Guten Tag Forum.

Der Ahnungslose hat wieder ein paar Fragen :)

Mir liegen mehere hundert Fotodateien (und es ist ein immer wiederkehrender Prozess) vor, die eine bestimmte Namensgebung haben:
Modell-Artikel-Farbe-BildNr.Suffix

Diese Namensgebung kann ich leider nicht für alle Systeme verwenden.
Daher suche ich eine Möglichkeit, die Namen so einfach wie möglich in neue Dateien mit anderen Namensgebungen zu kopieren.

Was ich bisher gemacht habe:
Ich habe mir über einen Dos Befehl (dir /b) den Inhalt eines Verzeichnisses in eine Tabelle importiert. Das Quellverzeichnis habe ich in einem Formularfeld   Me.Pfad_Import   definiert.
Die Dateinamen habe dann in der weiteren Verarbeitung in Blöcke/Spalten aufgeschlüsselt (Replace und Split Funktion). (siehe Code)
Mit dieser erstellten Tabelle (Import_Split) möchte ich mir jetzt die Dateinamen via VBA zusammenbauen wie ich sie brauche.

In einer anderen Lösung habe ich aufwendig über Abfragen verschiedene Tabellen zusammengefügt und erstellt und wieder zusammengewürfelt - zum Schluß eine Tabelle ähnlich einer Batchdatei mit den Strings und Copy Befehlen in einer Spalte rausbekommen, die ich dann exportieren umbenennen und per shell Befehl ausführen konnte. Da ging es aber nur darum einen Prefix anzufügen.
Das ist hier in dem Fall aber zu kompliziert. Also für mich.

Folgender Aufbau:
Die Quelltabelle "Import_Split" hat folgende Text-Felder:
Modell;Artikel;Farbe;Bild;Suffix
BSPs:
33333;44444;5555;MAIN;JPG => Erstes Bild
33333;44444;5555;PT01;JPG => Zweite Ansicht von Bild 1
33333;44444;5555;PT02;JPG => Dritte Ansicht
...
33333;44444;5555;PT09;JPG => Zehnte Ansicht
22222;77777;6666;MAIN;JPG => Erstes Bild
22222;77777;6666;PT01;JPG => Zweite Ansicht von Bild 1
11111;99999;2222;MAIN.JPG => Nur 1 Bild vorhanden
44444;99999;2222;MAIN.JPG => Nur 1 Bild vorhanden
usw.

Hier ergeben sich für mich schon mal die Probleme, dass die Bilder nicht richtig durchnummeriert sind.
Das erste Bild heißt .MAIN und das zweite .PT01. Ich kann den Namen also nicht einfach kürzen, sondern muss bei manchen Namen aus .MAIN = 1 machen, und bei anderen den Namen auf 3 Stellen kürzen + Wert 1 (BSP: PT01 = ...1 +1 =Bild Nr. 2)

Ich dachte via VBA würde das am besten funktionieren, scheitere aber an der Umsetzung!


Was brauche ich:
------------------------------------------
Alle Namen die im Feld "Bild" die Zeichenfolge "MAIN" haben müssen wie folgt dargestellt/umdefiniert werden:
BSP ORIGINAL: 33333;44444;5555;MAIN;JPG

1) Modell & "-" & Artikel & "-" & Farbe & "." & Suffix
BSP: 33333-44444-5555.JPG

2) Modell & "-" & Artikel & "-" & Farbe & "." & "MAIN" & "." &Suffix
BSP: 33333-44444-5555.MAIN.JPG

3) Modell & Artikel & "_" & Farbe & "_"1" & "." & Suffix
BSP: 3333344444_5555_1.JPG   -> Tricky (aus MAIN wird 1)

------------------------------------------

Alle Namen die im Feld "Bild" die Zeichenfolge "PT01-PT09" haben müssen gekürzt werden, so dass nur noch die Ziffer da steht, und bei manchen Namen muss der Wert + 1 ergänzt werden ( ist aber ein Textfeld >:( )
BSP:33333;44444;5555;PT01;JPG

4) Modell & "-" & Artikel & "-" & Farbe & "-" & Bild & "." & Suffix
BSP: 33333-44444-5555-1.JPG (Das MAIN Bild bekommt keine Ziffer (siehe 1))

5) Modell & "-" & Artikel & "-" & Farbe & "." & "PT01-09" & "." &Suffix
BSP: 33333-44444-5555.PT01.JPG

6) Modell & Artikel & "_" & Farbe & "_"1" & "." & Suffix
BSP: 3333344444_5555_2.JPG  -> Tricky (PT01= ..1+1)

------------------------------------------
Und so sollte die ganze Tabelle abgearbeitet werden.

Die Zielverzeichnisse, wo die Dateien anschließend (oder während dessen) hinkopiert werden, kommen aus Formularfeldern Me.Pfad1 für Dateitypen 1) und 3), Me.Pfad2 für 2) und 4), Me.Pfad3 für 3) und 6).

Mein Ziel ist es, die Bilder anhand der neuen Namensgebungen automatisch in die Zielverzeichnisse mit den richtigen Dateinamen kopieren zu lassen.

Meint Ihr, dass ist möglich? Ich kann das nicht...  :-\ . En riesengroßes Rätsel !
Wenn jemand das Fernsehabendprogramm nicht mehr sehen kann, wäre ich auch sehr dankbar für eine fertige Programmierung  :) ;)



Folgenden Code habe ich bis jetzt:

Private Sub Btn_UmbennenenStarten_Click()

'#### Erstellen einer Textdatei über DOS die als Importdatei genommen werden kann (BilderImport.csv)
'#### Die erste Zeile wird beim Import verschluckt, daher Dummy Zeile vorab
Shell ("cmd /C echo Bilderimport" & " > " & Me.Pfad_SichTemp_Importdatei & "\BilderImport.csv")
Shell ("cmd /C dir /b " & Me.Pfad_Import & "\*." & Me.BildSuffixFilter & " >>" & Me.Pfad_SichTemp_Importdatei & "\BilderImport.csv")


'#### Import der Datei mit den Bildnamen
If Trim(Nz(Me!Pfad_Import, "")) = "" Then MsgBox "Importdatei fehlt.", , "    * ABBRUCH *"

CurrentDb.Execute "DELETE FROM Import", dbFailOnError

      DoCmd.TransferText acImportDelim, "BilderImport_Importspezifikation", "Import", _
       Me.Pfad_SichTemp_Importdatei & "\BilderImport.csv", True

'Importdatei ist nach Import überflüssig - Datei löschen
Kill Me.Pfad_SichTemp_Importdatei & "\BilderImport.csv"


'#### Replace - Aus . wird -
' Funktioniert nicht
'  Dim strsql as string
'  strsql = "UPDATE Import SET Import.Feld1 = Ersetzen([Import.Feld1];".";"-")"
' Funktioniert nicht
'Meine Lösung mit dem gleichen SQL Befehl in einer Abfrage=
DoCmd.SetWarnings (False)
DoCmd.OpenQuery "AktAbf_In_ImportTab_Punkt_durch_Strich_ersetzen", , acReadOnly
DoCmd.SetWarnings (True)

'#### Split : Feld1 nach "-" Zeichenfolgen aufbröseln und in neue Tabelle schreiben
Dim dbsQuell, rstQuell, rst1Quell
Dim werteQuell() As String
Set dbsQuell = CurrentDb

CurrentDb.Execute "DELETE FROM Import_Split", dbFailOnError

Set rstQuell = dbsQuell.OpenRecordset("Import")
Set rst1Quell = dbsQuell.OpenRecordset("Import_Split")

    If Not (rstQuell.EOF And rstQuell.BOF) Then
        rstQuell.MoveFirst
        Do Until rstQuell.EOF
        'neu'Do Until rstQuell.EOF = True
           
            werteQuell = Split(rstQuell("Feld1").Value, "-", -1, 1)
            rst1Quell.AddNew
            For X = LBound(werteQuell()) To UBound(werteQuell())
                rst1Quell.Fields(X).Value = CStr(werteQuell(X))
            Next
            rst1Quell.Update
        rstQuell.MoveNext
        Loop
    End If

    rstQuell.Close
    rst1Quell.Close
    Set dbsQuell = Nothing


'##### Kopierjobs Quelldateien aus Me.Pfad_Import mit Umbenennungen in Schleife in Zielverzeichnisse je nach Dateitypen kopieren - oder Tabellenerstellung mit Strings(?)
???????????????

'##### Export der Tabelle als Batch oder direkt kopieren????

End Sub


Ich könnte das ganze auch mit externen Tools machen. z.B. Lupas Rename.
Aber da muss man tierisch aufpassen und fummeln! Das ist sooooo aufwendig.

Und es muss so einfach wie möglich sein, damit es ein a) unbedarfter machen kann, es b) schneller geht und c) keine Fehler passieren.

Danke vorab für eure Hilfe !!!
Und ein schönes Wochenende, bis Monatg...  ;)

DF6GL

#1
Hallo,

ist die Beschreibung unter "Was brauche ich"  fehlerfrei?



Wenn die Originaldaten (ein Feld!) so umgewandelt werden müssen:




33333.44444.5555.MAIN.JPG      --> 33333-44444-5555-1.JPG
33333.44444.5555.PT01.JPG      --> 33333-44444-5555-2.JPG
33333.44444.5555.PT02.JPG      --> 33333-44444-5555-3.JPG

Als eine(!) Möglichkeit  (nicht die performanteste ;) ):


1)   Update tblTabelle set Feld1 = replace (Feld1,".","-")
2)   Update tblTabelle Set Feld1 = replace (Feld1,"Main","1")
3)   Update tblTabelle Set Feld1 = replace  (Feld1,"Pt0" ,"")
4)   Update tblTabelle Set Feld1 =  Left (Feld1,17) & Val(Mid(Feld1,18,1) +1) & ".jpg"



Andere Möglichkeit:

Public Funktion erstellen , die die Berechnungen pro Datensatz durchführt und die im Update-SQL-String aufgerufen wird.

ReneK

Hallo Franz.

Danke für das Feedback.

Ja, meine Beschreibung der Umwandlung ist so, wie ich es brauche.
Ich habe mir den Kram, dass das nicht durchnummeriert ist, nicht ausgedacht ...  :o

D.h., jetzt muss ich für mich umdenken.
Ich war auf dem Trip, und Splite die Tabelle, und baue das via VBA dann so um, wie ich es brauche.

Mit Deinem Ansatz müsste ich das dann so machen, dass ich die Import Datei zwei mal importiere, die eine Tabelle durch die Updates jeweils verändere und an eine dritte Tabelle anfüge und beide Tabellen dann, wenn alles umbeannt wurde, gegenüberstelle und die Copy Strings einfüge. Richtig?
(((OMG, das muss ich mir dann auch noch einmal zusammenwurschteln  ;) :o ::))))
Aber alles ist besser als es manuell zu machen  ;D

Zu Deinen Befehlen:
Befehl 4) funktioniert nicht. Typumwandlungsfehler?!. Und die Quelltabelle wird geleert.
Aber, da könnte ich doch auch einfach die Replace Version nehmen, und dann alle Nummern durchlafuen lassen, oder?

  Update tblTabelle Set Feld1 = replace  (Feld1,"Main" ,"1")
  Update tblTabelle Set Feld1 = replace  (Feld1,"Pt01" ,"2")
  Update tblTabelle Set Feld1 = replace  (Feld1,"Pt02" ,"3") usw...

Dann würde ich (in meinem Beispiel bei Nr.6) folgendes rausbekommen:
  33333-44444-5555-2.JPG

Wie lösche ich jetzt per SQL den ersten Bindestrich?
Die letzten beiden kann ich ja wieder mit "_" replacen?!
Ich muss ja  3333344444_5555_2.JPG  in dem Beispiel rausbekommen.


Mal 'ne grundsätzliche Frage.
Was muss ich unter VBA eintragen, damit das Update über den VBA Scirpt ausgeführt wird?
Ich bekomme da eine Syntax Fehlermeldung


  Dim strsql As String
  strsql = "UPDATE Import SET Feld1 = Replace(Feld1;".";"-")"


Danke vorab  :)

Beaker s.a.

Hallo Rene,
In VBA musst du Komma "," verwenden statt Semikolon ";"
Zitatstrsql = "UPDATE Import SET Feld1 = Replace(Feld1,".","-")"
Und natürlich musst du die Abfrage jeweils auch ausführen
CurrentDb.Execute strsql, dbFailOnError
gruss ekkehard
Alles, was geschieht, geschieht. - Alles, was während seines Geschehens etwas anderes geschehen lässt, lässt etwas anderes geschehen. - Alles, was sich selbst im Zuge seines Geschehens erneut geschehen lässt, geschieht erneut. - Allerdings tut es das nicht unbedingt in chronologischer Reihenfolge.
(Douglas Adams, Mostly Harmless)

markusxy

@Beaker s.a.,
das Doppelte Hochkomma muss man bei einer String Zuweisung entweder maskieren oder durch ein einfaches ersetzen!

ReneK

Hallo.

Danke Beaker und Markus.

So gehts

  Dim strsql As String
  strsql = "UPDATE Import SET Feld1 = Replace(Feld1,""."",""-"")"
  CurrentDb.Execute strsql, dbFailOnError


Oder so

  Dim strsql As String
  strsql = "UPDATE Import SET Feld1 = Replace(Feld1,'.','-')"
  CurrentDb.Execute strsql, dbFailOnError


;D

Beaker s.a.

@Markus
Ja, habe ich übersehen  >:(. Aber der TS hat's ja hinbekommen.  :)
Alles, was geschieht, geschieht. - Alles, was während seines Geschehens etwas anderes geschehen lässt, lässt etwas anderes geschehen. - Alles, was sich selbst im Zuge seines Geschehens erneut geschehen lässt, geschieht erneut. - Allerdings tut es das nicht unbedingt in chronologischer Reihenfolge.
(Douglas Adams, Mostly Harmless)

ReneK

#7
Guten Morgen.

Ich bin soweit durch. Auch der Export bis zur Batch funktioniert.
Ob schön oder nicht, ist erstmal zweitrangig für mich.

Ich habe allerdings noch ein Problem mit der Umbenennung in dieses Format:

Ziel:
- Der erste "-" muss weg.
- Der zweite "-" wird zum "_".
- Der erste "." wird zum "_".
- Aus "Main" wird die 1.
- Aus PT01-9 wir "PT0 entfernt, und die Ziffer um +1 erhöht.
- Alles Textfelder.

Beispiele Quellformat:
BSP1: 33333-44444-5555.Main.JPG -> 3333344444_5555_1.JPG
BSP2: 33333-44444-5555.PT01.JPG -> 3333344444_5555_2.JPG
BSP3: 33333-44444-5555.PT02.JPG -> 3333344444_5555_3.JPG
usw.

Zudem, der Code von Franz bringt mir den Fehler Datentypenkonflikt in Kriterienausdruck / Laufzeitfehler '3464'

  Dim strsql As String
  strsql = "Update ImportA4F Set Feld1 =  Left (Feld1,17) & Val(Mid(Feld1,18,1) +1) & '.jpg'"
  CurrentDb.Execute strsql, dbFailOnError


Kann mir da jemand weiterhelfen???

Vorab Danke.




Bei den anderen "Umformatierungen" habe ich es exemplarisch jetzt so gemacht


Shell ("cmd /C echo Bilderimport" & " > " & Me.Pfad_SichTemp_Importdatei & "\BilderImport.csv")
Shell ("cmd /C dir /b " & Me.Quellverzeichnis & "\*." & Me.BildSuffixFilter & " >>" & Me.Pfad_SichTemp_Importdatei & "\BilderImport.csv")

If Trim(Nz(Me!Quellverzeichnis, "")) = "" Then MsgBox "Importdatei fehlt.", , "    * ABBRUCH *"

CurrentDb.Execute "DELETE FROM Import", dbFailOnError

      DoCmd.TransferText acImportDelim, "BilderImport_Importspezifikation", "Import", _
       Me.Pfad_SichTemp_Importdatei & "\BilderImport.csv", True

DoCmd.SetWarnings (False)
DoCmd.CopyObject , "ImportA", acTable, "Import"
... ...
DoCmd.SetWarnings (True)

CurrentDb.Execute "DELETE FROM AUSGABE", dbFailOnError

Dim strsqlBat1
strsqlBat1 = "INSERT INTO AUSGABE ( [String] ) SELECT DosSteuerbefehle.Befehle FROM AUSGABE RIGHT JOIN DosSteuerbefehle ON AUSGABE.String = DosSteuerbefehle.Befehle"
CurrentDb.Execute strsqlBat1, dbFailOnError

'-----
  Dim strsqlA1 As String
  strsqlA1 = "UPDATE ImportA SET Feld1 = Replace([Feld1],'.MAIN','')"
  CurrentDb.Execute strsqlA1, dbFailOnError
 
  Dim strsqlA2 As String
  strsqlA2 = "UPDATE ImportA SET Feld1 = Replace([Feld1],'.PT0','-')"
  CurrentDb.Execute strsqlA2, dbFailOnError
 
  DoCmd.DeleteObject acTable, "AUSGABE_ImportA"

  Dim strsqlA3 As String
  strsqlA3 = "SELECT '@copy /y ' & [Verzeichnisse]![Quellverzeichnis] & '\' & [Import.Feld1] & ' ' & [Verzeichnisse]![Zielverzeichnis_A] & '\' & [ImportA.Feld1] & ' >nul' AS [String] INTO AUSGABE_ImportA FROM Verzeichnisse, ImportA INNER JOIN Import ON ImportA.ID = Import.ID"
  CurrentDb.Execute strsqlA3, dbFailOnError
 
  Dim strsqlA4
  strsqlA4 = "INSERT INTO AUSGABE ( [String] ) SELECT AUSGABE_ImportA.String FROM AUSGABE RIGHT JOIN AUSGABE_ImportA ON AUSGABE.String = AUSGABE_ImportA.String"
  CurrentDb.Execute strsqlA4, dbFailOnError

... ...

Dim Ausgabepfad, strMsg As String, intResponse As Integer, blnTryAgain As Boolean
        strMsg = "Sie haben auf Abbrechen geklickt, oder die Eingabe ist leer. "
        strMsg = strMsg & vbCrLf & vbCrLf & "Möchten Sie eine Eingabe tätigen?"
            Do
                Ausgabepfad = InputBox("Geben Sie den Pfad für die Verarbeitungsdateien ein. (z.B. C:\Temp)", "Pfadeingabe erforderlich (AUSGABE_FotoUmbenennung.txt + .bat)", "T:\")
     
                    If Dir(Ausgabepfad) = "" Then
                    Else
                        MkDir (Ausgabepfad)
                    End If

                    If Ausgabepfad = "" Then
                        intResponse = MsgBox(strMsg, vbQuestion + vbYesNo + vbDefaultButton2, "Pfadeingabe erforderlich")
         
                    If intResponse = vbYes Then
                        blnTryAgain = True
                    Else
                        blnTryAgain = False
                        Exit Sub
                        End If
                    Else
                        'MsgBox "Sie verwenden den Pfad " & Ausgabepfad
                        blnTryAgain = False
                    End If
            Loop While blnTryAgain

Dim Ausgabedatei As String
Ausgabedatei = Ausgabepfad & "\AUSGABE_FotoUmbenennung.txt"
            DoCmd.TransferText acExportDelim, "AUSGABE_FotoUmbenennung_Exportspezifikation", _
            "AUSGABE", Ausgabedatei


    Dim Batchdatei As String
    Batchdatei = Left(Ausgabedatei, InStrRev(Ausgabedatei, ".")) & "bat"
        If Dir(Batchdatei) = "" Then
             FileCopy Ausgabedatei, Batchdatei
        Else
             Kill (Batchdatei)
            FileCopy Ausgabedatei, Batchdatei
        End If
       
Call Shell(Batchdatei, 1)


ReneK

Huhu.

Ich glaube ich habe es.
Nicht schön aber selten  :D


  Dim strsql As String
    strsql = "Update ImportA4F Set Feld1 = Mid (Feld1,1,5) & Mid (Feld1,7,25)"
    CurrentDb.Execute strsql, dbFailOnError

    strsql = "UPDATE ImportA4F SET Feld1 = Replace(Feld1,'-','_')"
    CurrentDb.Execute strsql, dbFailOnError
    strsql = "UPDATE ImportA4F SET Feld1 = Replace(Feld1,'.MAIN','_1')"
    CurrentDb.Execute strsql, dbFailOnError
    strsql = "UPDATE ImportA4F SET Feld1 = Replace(Feld1,'.PT01','_2')"
    CurrentDb.Execute strsql, dbFailOnError
    strsql = "UPDATE ImportA4F SET Feld1 = Replace(Feld1,'.PT02','_3')"
    CurrentDb.Execute strsql, dbFailOnError
    strsql = "UPDATE ImportA4F SET Feld1 = Replace(Feld1,'.PT03','_4')"
    CurrentDb.Execute strsql, dbFailOnError
    strsql = "UPDATE ImportA4F SET Feld1 = Replace(Feld1,'.PT04','_5')"
    CurrentDb.Execute strsql, dbFailOnError
    strsql = "UPDATE ImportA4F SET Feld1 = Replace(Feld1,'.PT05','_6')"
    CurrentDb.Execute strsql, dbFailOnError
    strsql = "UPDATE ImportA4F SET Feld1 = Replace(Feld1,'.PT06','_7')"
    CurrentDb.Execute strsql, dbFailOnError
    strsql = "UPDATE ImportA4F SET Feld1 = Replace(Feld1,'.PT07','_8')"
    CurrentDb.Execute strsql, dbFailOnError
    strsql = "UPDATE ImportA4F SET Feld1 = Replace(Feld1,'.PT08','_9')"
    CurrentDb.Execute strsql, dbFailOnError
    strsql = "UPDATE ImportA4F SET Feld1 = Replace(Feld1,'.PT09','_10')"
    CurrentDb.Execute strsql, dbFailOnError