eeleater
Goto Top

pdf-dateien mittels einer txt-datei und batch-dateien umbenennen

hallo, ich habe das problem, dass ich eine textdatei, bericht.txt, habe, und etwas über 50000 pdf dateien.

nun will ich es so, dass diese pdf dateien, 78381_Seite_1.PDF als beispiel, umbenannt werden sollen in: 69894_Seite_2.PDF

ein test inhalt der bericht.txt:

Bestell-Nr. Beschreibung Erstell-Datum Land Dokumentenstatus Information Dokument-ID Ersteller Eintrag vom Änderung durch Letzte Änderungen Letzter Zugriff Letzter Zugriff am Seiten Verknüpfte Dokumente

P16841 Microfinance for the Poorest 08.03.2007 Pakistan Neu Dokument P16841 : Pakistan - Microfinance for the Poorest 89358 Frau Bolduan 09.03.2007 14:53:15 Systemverwalter_1 09.03.2007 14:53:18 Frau Bolduan 09.03.2007 15:02:15

in den dateinamen sind die 5 zahlen vorne variabel, sowie die seitenzahl hinter seite_x ebenfalls. in der datei bericht.txt sind alle daten, die benötigt werden zum umbenennen, enthalten. die dokument-id "89358" soll zum beispiel durch die bestellnummer "P168412" ersetzt werden. also muss die dokument-id in der datei gesucht werden, dazu die passende datei ebenfalls, und dann muss die dokument-id vorne durch die bestellnummer ersetzt werden.

ich hoffe das ist jetzt verständlich, wenn nicht tut es mir leid, aber besser kann ich es nicht erklären.

Content-ID: 54166

Url: https://administrator.de/contentid/54166

Ausgedruckt am: 22.11.2024 um 21:11 Uhr

Biber
Biber 15.03.2007 um 18:25:15 Uhr
Goto Top
Moin eeleater,

willkommen im Forum.

Das sind zu unzureichende Informationen für mich.
Insbesondere Deine Phantasien mit
...78381_Seite_1.PDF als beispiel, umbenannt werden sollen in: 69894_Seite_2.PDF...
sind mir nicht nachvollziehbar.
In dem geposteten Gesamtabzug ist zwar irgendwo eine Spalte "Seiten" angegeben, aber erstens ist die leer und zweitens sieht die für mich eher nach einer Gesamtseitenzahl aus.

Wenn ich die beiden Beispielsätze mit einem FOR /F-Einzeiler auslesen würde, käme heraus:
>aallutscher.bat
[BestellNr: Bestell-Nr.] [DokID: Dokument-ID] [Seiten: Seiten]
[BestellNr: P16841] [DokID: 89358] [Seiten: ]
...d.h. Bestell-Nummer und Dokumenten-ID würden gefunden werden, aber bei "Seiten" steht nix.

Welche Datei(en) sollten jetzt a) gesucht werden b) in was umbenannt werden?

Bitte doch bitte den offensichtlich stinkefaulen Erzeuger dieses Gesamt-Berichts mal darum, Dir eine Liste zu exportieren mit den 2 (3? 4?) Feldern, die Du wirklich brauchst ("alte" Dokumenten-ID; "neue" Bestellnummer; Seitenangabe (alt) falls relevant; Seitenangabe (neu) falls Relevant).
Und das Ganze mit ";" getrennt statt mit TABs.

Und von Dir fehlt noch die Information, ob Du
- eine Log-Datei brauchst für alle umbenannten (alterName, neuerName) und/oder
- eine separate Logdatei für alle nicht gefundenen und
- ob denn Kollisionen zu erwarten sind (der "neue" Zielname tritt mehrfach auf) und wie damit umzugehen ist.

Gruss
Biber
maneich
maneich 15.03.2007 um 18:38:16 Uhr
Goto Top
Hallo,

für jemand der neben Dir steht/sitzt ist Deine Erluterung möglicherweise einleuchtend, aus der Ferne aber kann man damit nicht viel anfangen.

Du hast also eine Text-Datei "bericht.txt", OK.

In dieser stehen am Anfang jeder Zeile die Bestell-Nr. Und in der Mitte der Zeile steht die Document-ID. Die Document-ID soll nun durch die Bestell-Nr. ersetzt werden, auch OK.

Hat die Bestell-Nr. eine feste Länge? Wenn nein, ist sie von den nächsten Angaben in dieser Zeile durch ein Leerzeichen getrennt??

Welches Kriterium gilt für die Seiten-Nr.. Steht die neue Nr. auch irgendwo in der Zeile in bericht.txt oder soll hier fortlaufend nummeriert werden oder welche Vorstellungen hast Du hier??

Liegen die PDF-Dateien alle im gleichen Verzeichnis oder in Unterordner des gleichen Hauptverzeichnisses??

Mit den notwendigen Informationen ist das sicher machbar; in Deinem Fall würde ich aber vorschlagen, das mit einem VBS-Script durchzuführen. Ist schneller und die meisten Befehle die Du dazu benötigst, sind schon fest vorgegeben.

MfG maneich
eeleater
eeleater 15.03.2007 um 20:08:18 Uhr
Goto Top
@Biber:
Welche Datei(en) sollten jetzt a) gesucht werden b) in was umbenannt werden?
zu a) die alten dateien mit den einmaligen dokumenten ids,
zu b) die dateien sollen einfach nur nachdiesem scema umbenannt werden:

dokumenten-id_Seite_x.pdf > bestellnummer_Seite_x.pdf

wenn möglich kann die seiten anzahl ja von den alten dateien abgeleitet werden.
wenn nicht ist dies auch egal.

- eine Log-Datei brauchst für alle umbenannten (alterName, neuerName) und/oder
- Nein brauche ich nicht unbedingt, aber wenn es machbar wäre, wäre das auch nicht schlimm.

- ob denn Kollisionen zu erwarten sind (der "neue" Zielname tritt mehrfach auf) und wie damit umzugehen ist.
- nein, jede Bestellnummer besteht nur einmal, von diesem Standpunkt aus, dürften keine Kollisionen auftreten.

@maneich:

Hat die Bestell-Nr. eine feste Länge? Wenn nein, ist sie von den nächsten Angaben in dieser > Zeile durch ein Leerzeichen getrennt??

Ja. Hat sie. 6 Zeichen.

Welches Kriterium gilt für die Seiten-Nr.. Steht die neue Nr. auch irgendwo in der Zeile in
bericht.txt oder soll hier fortlaufend nummeriert werden oder welche Vorstellungen hast Du > hier??

Ehrlich gesagt, ist die Seitennummer egal, tut mir leid wenn ihr da zu viel überlegen musstet.

Liegen die PDF-Dateien alle im gleichen Verzeichnis oder in Unterordner des gleichen
Hauptverzeichnisses??

Ja, alle liegen im selben ordner.

Mit den notwendigen Informationen ist das sicher machbar; in Deinem Fall würde ich aber vorschlagen, das mit einem VBS-Script durchzuführen. Ist schneller und die meisten Befehle die Du dazu benötigst, sind schon fest vorgegeben.

MfG maneich
Biber
Biber 15.03.2007 um 20:53:51 Uhr
Goto Top
Na gut, eeleater,

dann wäre das Batch-Grundgerüst (ausnahmsweise in epischer Breite langgezogen) so:

::---------snipp aaliBaba.bat
@echo off & setlocal enabledelayedExpansion
Set "logdatei=con:"  
REM Hier steht nach dem "delims= eine TAB-Taste als Trennzeichen !!!  
@for /f "skip=1 tokens=1,7,14 delims=	" %%i in (bestell.txt) do call :renameAll %%j %%i %%k  
goto :eof

:renameAll 
@echo [oldDokID:%1] [newBestellNr: %2]  [Seiten:%3]
for %%i in (%1*.pdf) do call :renameOne %%i %1 %2 %3
GOTO :eof

:renameOne
REM Parameter1=die gefundene PDF-Datei; Param2=alterNamensTeil Param3=neuer NamensTeil 
REM Param4 (unused) ist diese Seitenangabe..falls irgendwann sinnvoll
Set theFoundPdf=%1
Set thenewName=!theFoundPdf:%2=%3!
<b>ECHO </b>rename %theFoundPdf% %theNewName% 
if not errorlevel 1 echo Renamed: %theFoundPdf% to %theNewName% >>%logdatei%
goto :eof

Das fette ECHO muss nach dem Testen und Anpassen raus.
Und der Name der %logdatei% am Anfang geändert werden.

Der Mini-Batch geht davon aus, dass er in dem Verzeichnis gestartet wird, wo sich auch bestell.txt und *.pdfs befinden.

Gruss
Biber

P.S. Wären Semicola und nicht diese albernen TABSTOPPs als Delimiter verwendet worden, hätte es auch ein Oneliner vom CMD-Prompt getan. Selbst verursachte Leiden...
P.P.S. Hab ich bemerkt, dass Du auf meine Bitte nach einer sinnvoll erzeugten "Bericht.txt" nicht reagiert hast face-wink
eeleater
eeleater 15.03.2007 um 21:01:06 Uhr
Goto Top
fettes thx!

ich danke dir 1000x dafür!!!!!
Biber
Biber 15.03.2007 um 21:05:29 Uhr
Goto Top
Na, warte lieber erst mal ab, ob der Batch mehr macht außer Plattenplatz belegen... face-wink

Wenn es klappt, setz bitte den Beitrag auf "gelöst" bei Gelegenheit.

Danke
Biber
eeleater
eeleater 16.03.2007 um 09:10:41 Uhr
Goto Top
sorry, aber ich hab heute erfahren, dass der gesamte dateiname einfach nur durch die bestellnummer ersetzt werden soll.

nach diesem schema:
dokument-id_Seite_x.pdf > bestellnummer.pdf
Biber
Biber 16.03.2007 um 09:22:21 Uhr
Goto Top
Na, hast Du ein Glück...

Dann kannst Du den Batch ja noch ein bisschen eindampfen:
::---------snipp aaliBaba.bat
@echo off & setlocal
Set "logdatei=con:"  
REM Hier steht nach dem "delims= eine TAB-Taste als Trennzeichen !!!  
@for /f "skip=1 tokens=1,7 delims=    " %%i in (bestell.txt) do (  
     If exist %%j*.pdf rename  %%j*.pdf %%i.pdf && echo Renamed: %%j*.pdf to %%i.pdf >>%logdatei%
)

Gruss
Biber
eeleater
eeleater 16.03.2007 um 09:30:32 Uhr
Goto Top
das geht so leider nicht, bei der ersten ausführung des codes hatte er einen syntaxfehler,
bei der zweiten und dritten usführung meinte er nur,
Dateiname existiert bereits, oder die Datei konnte nicht gefunden werden.
Biber
Biber 16.03.2007 um 09:47:55 Uhr
Goto Top
Dann überprüf bitte mal, ob in Deiner *.bat-Datei auch noch ein TAB-Zeichen dort steht, wo eins sein soll.
Bei mir ...
>aali.bat
Renamed: 89358*.pdf to P16841.pdf
..works as designed...

Gruss
Biber
eeleater
eeleater 16.03.2007 um 09:59:29 Uhr
Goto Top
wenn du die vier leerzeichen nach dem delims meinst, dann stimmt das, aber müsste da nicht ein einfacher tab-stopp hin, statt 4 leerschritten?
Biber
Biber 16.03.2007 um 10:02:44 Uhr
Goto Top
Ja, diese vier Leerzeichen meinte ich.
Bitte dort wieder einen TAB statt der vier Leerzeichen einfügen.

Gruss
Biber
eeleater
eeleater 16.03.2007 um 10:05:14 Uhr
Goto Top
ist da ja, aber es geht trotzdem nicht so wie es eigentlich laufen sollte

edit:ich habe es mal getestet, habe zwei leere pdf-dateien erstellt mit 2 nummern aus der datei, die erste erhält nur "--------.pdf" als dateinamen, die zweite wird korrekt umbenannt.

EDIT2:
Nun geht alles ich habe einfach bei skip= statt 1 eine 6 hingeschrieben, und nun geht alles.

aber trotzdem danke!!!!
maneich
maneich 16.03.2007 um 12:28:19 Uhr
Goto Top
Hallo

probiere es mal mit diesem Script. Notepad örffnen, hineinkopieren, Name vergeben mit der Endung .vbs.

Es ist wichtig, daß außer den PDF-Dateien keine anderen Dateitypen z.B. die bericht.txt oder rename.log (wird hier verwendet um die umbenannten Dateien aufzulisten) in diesem Verzeichnis abgelegt sind.

Script.Name = ren_dat_fo.vbs
ab hier kopieren
'bericht.txt und rename.log dürfen nicht im Ordner der PDF-Dateien liegen

Set fs = CreateObject("Scripting.FileSystemObject")
p_1 = "Verzeichnispfad" 'Hier den echte Pfad des PDF-Ordners rein
Set f1 = fs.GetFolder(p_1)
Set fn = fs.OpenTextFile("Verzeichnispfad\rename.log", 2, True) 'Hier Pfad wo rename.log abgelegt werden soll
fn.WriteLine "Liste der umbenannten Pdf-Dateien 1. neuer Name / 2. alter Name"
fn.WriteBlankLines(1)
ren_pdf anz_fils
WScript.Echo "Das Script ist beendet!!" & vbLf & "soweit alle PDF-Dateien in bericht.txt erfaßt sind" & vbLf & "sind auch alle Dateien unbenannt"
WScript.Quit

Sub ren_pdf(anz)
Dim j,f_na,dat,a_n
For Each file in f1.Files
f_na = left(file.Name, 6)
Set f = fs.OpenTextFile("Verzeichnispfad\bericht.txt", 1) 'hier den Pfad der bericht.txt eintragen
do
dat = f.ReadLine
If 0 < InStr(dat, f_na) Then
a_n = file.Name : Set datei = file
datei.Name = left(dat, 6)&".pdf"
fn.WriteLine datei.Name & " " & a_n
f.Close
Exit do
End If
Loop Until f.AtEndOfStream
j = j + 1
If j = anz Then
Exit For
End If
Next
End Sub

Function anz_fils
Dim i,dat
i = 0
For Each file in f1.Files
:i = i+1
Next
anz_fils = i : i = ""
End Function
bis hier


MfG maneich
eeleater
eeleater 16.03.2007 um 12:41:11 Uhr
Goto Top
danke, aber mit batch funktioniert es schon so!

trotzdem danke, dass du dir die mühe gemacht hast!!