andichrist
Goto Top

Verarbeitung bzw. Auswertung einer TXT-Datei und entsprechend Verzeichnisse umbenennen

Ich benötige eine Batch die zB. im Ordner C:\Temp bei allen vorhanden Verzeichnisnamen die ersten 4 Stellen ausliest. In einer erstellten 'abgleich.txt' die passende Zahl sucht (Zahl vor dem Semikolon) und anschließend dieses Verzeichnis mit der neuen Beschreibung (nach dem Semikolon) umbenennt!
Beispielformatierung in abgleich.txt:
3650;3648 - Blumenvase lila

Hallo an Alle,


Das Szenario:
Ich habe zwei Inventarliste(ALT).txt und Inventarliste(NEU).txt die abgeglichen werden sollen.Von dem alten Artikelbestand gibt es pro Artikel ein Verzeichnis (exakt gleiche Namen wie in der Inventarliste(ALT).txt). Master soll nun die neue Inventarliste werden. Und entsprechend die alten (vorhandenen) Verzeichnisse umbenannt werden!

Dummerweise gibt es zum Teil eine neue Nummerierung bei der neuen Inventarliste(NEU).txt und entsprechend sollen die alten Verzeichnisse umbenannt werden. Hierzu habe ich ich eine TXT-Datei abgleich.txt erstellt!

ALT OrdnerStruktur sowie Inhalt der Inventarlisten(ALT).txt

0000 - Blaues Geländer
0001 - Treppenabsatz beige
....
3648 - Duschkopf chrom
3649 - Duschkopf blau
3650 - Blumenvase lila
3651 - Blumenvase grün
3652 - Abflußrohr
...
3753 - Stehlampe Modell Klara
3754 - Funkuhr Modell Schwarzwald
3755 - Tisch
....



NEU OrdnerStruktur sowie Inhalt der Inventarlisten(NEU).txt

0000 - Blaues Geländer 
0001 - Treppenabsatz beige 
.... 
3648 - Blumenvase lila 
3649 - Duschkopf blau 
3650 - Duschkopf CHROM 
3651 - Abflußrohr 
3652 - Blumenvase grün 
... 
3753 - Stehlampe Modell Klara 
3754 - Funkuhr Modell Schwarzwald 
3755 - Tisch 
....

An dem Beispiel ist ersichtlich, dass die Artikelbezeichnung sowie die Nummerierung nicht identisch sind. Inhaltlich haben sie die gleichen Artikel (leider ist die Rechtschreibung verschieden!)

Zur Aufgabe:
Ich habe jetzt eine TXT-Datei 'abgleich.txt' erstellt mit folgender Formatierung:


Hier kann man sehr gut die Unterschiede erkennen
... 
3650;3648 - Blumenvase lila 
3649;3649 - Duschkopf blau 
3648;3650 - Duschkopf CHROM 
3652;3651 - Abflußrohr 
3651;3652 - Blumenvase grün 
...

Zur Erklärung:
3650;3648 - Blumenvase lila 
(1)1. Zahl (4 Stellen) sind die ersten 4 Zahlen der bestehenden Artikelverzeichnisse bzw. Inventarlisten(ALT).TXT (beide sind identisch!). Nur die Zahl ist "eindeutig", die alte Artikelbeschreibung ist irrelevant!
(2)Trennzeichen ist ein Semikolon
(3)Neuer Verzeichnisnamen

Ich benötige eine Batch die zB. im Ordner C:\Temp bei allen vorhanden Verzeichnisnamen die ersten 4 Stellen ausliest. In der abgleich.txt die passende Zahl sucht (Zahl vor dem Semikolon) und anschließend dieses Verzeichnis mit der neuen Beschreibung (nach dem Semikolon) umbenennt!

Danke im Voraus für eure Lösungsvorschläge!

Grüße
Andychrist

[Edit: Rechtschreibung im Titel korrigiert]
umbennen ->umbenennen
Kommentar vom Moderator Biber am Nov 06, 2009 um 10:11:25 Uhr
...und entsprechend Verzeichnisse umbennen...
#rgc=624

Content-Key: 128777

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

Printed on: April 19, 2024 at 17:04 o'clock

Member: SamTrex
SamTrex Nov 06, 2009 at 07:23:39 (UTC)
Goto Top
Hallo Andi,
guck mal ....
const abgleichtxt = "abgleich.txt"	'Pfad zu deiner Ableich.txt mit Dateianamenangabe  
			'In diesem Fall im gleichen Ordner wie diese Datei!  
															
const pfad = "" 		'Pfad zu deinem Verzeichnis wo all die Ordner liegen - MUß mit \ enden!!!  
			'Nur "" heißt im gleichen Ordner wie diese Datei!  
																		
																		
dim objshell, objfso													
dim open_abgleichtxt, zeile, id, text

set objshell = createobject("wscript.shell")  
set objfso = createobject("scripting.filesystemobject")  
set open_abgleichtxt = objfso.opentextfile(abgleichtxt,1,false)			'Hier wird die Ableich.txt geöffnet  

do until open_abgleichtxt.atendofstream					'Solange durchlaufen bis sie zu ende ist  
	zeile = open_abgleichtxt.readline()					'Aktuelle Zeile wird eingelesen  
	id = split(mid(zeile,1,9),";")					'ID alt & neu werden in Array gelesen  
	text = mid(zeile, 10)						'Artikeltext wird extrahiert  
	if objfso.folderexists(pfad & id(0) & text) then				'Wenn der Ordner bereits vorhanden ist ...  
		objfso.movefolder pfad & id(0) & text, pfad & id(1) & text		'... wird er umbenannt  
	else							'oder ...  
		objfso.createfolder(pfad & id(1) & text)			'... erstellt  
	end if							'Ende der Ordnerprüfung  
loop								'Ende der Schleife  
open_abgleichtxt.close							'Ableich.txt schließen  

Sollte soweit selbsterklärend sein.
Wohin schick ich die Rechnung?

MfG Sam
Mitglied: 60730
60730 Nov 06, 2009 at 08:24:14 (UTC)
Goto Top
Servus,

langsam aber sicher wird deine Inventarliste aber zum running Gag?
Verarbeitung bzw. Auswertung einer TXT-Datei und entsprechend Verzeichnisseumbennen

Haben wir / Biber Bastla dir nicht schon genug Tipps gegeben, das du aus einer älteren gelösten ähnlichen Frage - die neue Anforderung nicht selber lösen kannst?


Gruß
Member: H41mSh1C0R
H41mSh1C0R Nov 06, 2009 at 08:46:59 (UTC)
Goto Top
Es ist halt "EASIER to ASK" ^^ und solange einer die Lösung liefert wird das so weitergehen oder meinste nicht?
Member: SamTrex
SamTrex Nov 06, 2009 at 10:39:38 (UTC)
Goto Top
Hallo Leute, (TimoBeil & H41mSh1COR)
sollte man denn bei solchen Fällen eher nicht Helfen?

Ich kann das schon nachvollziehen - wie ihr das seht. Als erstes gucke ich idR. auch erstmal mit der Frage bei Google nach.
Nur für Leute die so gar keine Ahnung haben ....
Jetzt habe ich bei TimoBeil gelesen das unser "Kunde" wohl schon Tipps bekommen hat ....

Wie seht Ihr das denn? Helfen - Verweisen - oder Stehenlassen????

Gruß Sam
Mitglied: 60730
60730 Nov 06, 2009 at 12:09:37 (UTC)
Goto Top
Servus Sam,

ganz eindeutig ich bin für helfen.

Nur sehe ich in manchen Fällen - wie z.B diesem - die Hilfe etwas anders, als evtl. andere.

Hilfe zur Selbsthilfe oder Hilfe - ein Problem selbstständig zu lösen.

Das mit dem "running Gag" ist doppeldeutig - einmal Bibers Counter - einmal eine Inventarliste die mittlerweile Ausmasse annimmt, dass man sich irgendwann mal fragt:

Ok - da will jemand ein spezielles "Problem" auf gewisse Art & Weise lösen - helfe ich gern - weil es eine Kleinigkeit ist.
Aber im Hinterkopf denkt man, eigentlich macht man sowas ganz anders - oder andersherum - das ist ein Fall für die Bank, die garantiert keinen Kredit gibt - die Datenbank.

Und wenn (wie in dem Fall) die Tipps offensichtlich nicht ausreichen, damit jemand "sein" Progrämmchen selber erweitern kann - dann darf es nicht sein, dass Biber/Bastla und Konsorten die Wartung für "seine" Lösung übernehmen.

Von daher, und weil wir alle ja eigentlich von unserem Arbeitgeber und nicht vom Forum oder vom Arbeitgeber der Fragesteller entlohnt werden - ist bei mir persönlich - irgendwann mal Schluss.

In der Regel "versuche" ich nur auf Fragen zu antworten - die ich "blind" lösen kann und oder die mich "interessieren".

Es schadet aber nie - wenn sich "ein neuer" um ein Problem kümmert, denn jeder hat seinen eigenen Stil, Probleme zu lösen und davon können alle lernen.

Gruß
Member: bastla
bastla Nov 06, 2009 at 13:43:43 (UTC)
Goto Top
Hallo Andy!

Ungetestet (wie eigentlich eh immer face-wink) die Batch-Variante:
@echo off & setlocal enabledelayedexpansion
set "targetdir=." & REM  oder Verz. setzen z.B.  set "targetdir=C:\Temp"   
set "Liste=Inventarlisten(NEU).txt"  

for /d %%i in ("%targetdir%\*") do (  
    set "Nr=%%~ni"  
    set Neu=
    for /f "tokens=1* delims=;" %%n in ('findstr /b "!Nr:~,4!;" "%Liste%"') do set "Neu=%%b"  
    if defined Neu (
        ren "%%i" "!Neu!"  
    ) else (
        echo Nicht umbenannt: %%i
    )
)
Grüße
bastla
Member: Andichrist
Andichrist Nov 07, 2009 at 01:26:03 (UTC)
Goto Top
Hallo und danke für die qualifizierten (sehr hilfreichen) und unqualifizierten (eher unsinnigen face-sad ) Kommentare!

Danke @ SamTrex für Deinen „konstruktiven Beitrag“ und Deinen Lösungsansatz.

Danke @bastla für Deine Lösung, die funktioniert - von kleinen organisatorischen Problemen abgesehen - ganz gut!

@all!
Das ist ein öffentliches Forum in dem jeder Fragen zum passenden Themen-Bereich stellen kann und darf. Jedem aktiven User steht es frei nach seinem Kenntnisstand Fragen konstruktiv zu beantworten oder auch bleiben zu lassen!

Bei den Usern @ TimoBeil und @ H41mSh1C0R trifft eindeutig letzteres zu!

PS:
wenn jemand mit einer Frage überfordert ist oder keine Lust hat darauf zu Antworten – lasst es einfach! Niemand wird dazu gezwungen oder genötigt zu Antworten!

In diesem Sinne

So long
Live long and prosper
AndyChrist
Member: SamTrex
SamTrex Nov 07, 2009 at 10:22:24 (UTC)
Goto Top
Hi Andy,
du mußt die beiden schon verstehen... Natürlich ist das ein öffendliches Forum. Aber wenn du dir mal ansiehst wie lange und intensiv hier einige (einige viele wie timobeil, bastla, biber, dog etc.) im Forum arbeiten kannst du dir vorstellen wie oft hier die annähernd gleichen Fragen kommen. Ich selbst bin hier auch schon eine halbe Ewigkeit angemeldet, arbeite aber erst seit kurzem aktiv mit... Und es ist nicht allzu selten das wirklich sehr ähnliche Fragen kommen. Auch sehr viel das einfach auch so bei Google hätte eingegeben werden können bzw. was man mit ein wenig Recherche hätte herausfinden können. Nur leider - und das ist es was den Kollegen auf den Senkel geht - tun das die meisten nicht und posten hier erstmal. Sprich wir haben hier nachher 20-30 mal das gleiche stehen.

Nun unterstelle ich dir mal keine Ahnung von Batch oder VBS zu haben. - Wenn ich daran zurück denke wo ich angefangen habe ... naja. Es muß ja auch nicht jeder alles Wissen - dafür sind wir ja da.
Also nimm es den Jungs nicht zu sehr übel. Wenn dich jedes mal einer das gleiche fragt ohne vorher mal selber zu überlegen bekommst du garantiert auch ne Kriese.
Solltest du allerdings überhaupt keine Ahnung von dem haben was du da haben möchtest (Umsetzung etc.) - was ich mal unterstelle - ist es vollkommen ok. Allerdings würde ich persönlich das oben drüber schreiben...

IdS. Sam
Member: Andichrist
Andichrist Nov 09, 2009 at 18:13:30 (UTC)
Goto Top
Hallo,


ich habe @bastlas Batch jetzt ausgiebig getestet. Leider funktioniert das Auslesen und Umbenennen nicht so ganz:

Inhalt von c:\Temp

Verzeichnisse Istzustand:
<code type=“plain“>
3648 - Duschkopf chrom
3649 - Duschkopf blau
3650 - Blumenvase lila
3651 - Blumenvase grün
3652 - Abflußrohr


Die „abgleich.txt“ (zur Erinnerung: welcher Ordner soll wie umbenannt werden)
3650;3648 - Blumenvase lila
3649;3649 - Duschkopf blau
3648;3650 - Duschkopf CHROM
3652;3651 - Abflußrohr
3651;3652 - Blumenvase grün

ERGEBNIS nach Batch-Aufruf (neue Verzeichnis-Struktur):
<code type=“plain“>
%b
3649 - Duschkopf blau
3650 - Blumenvase lila
3651 - Blumenvase grün
3652 - Abflußrohr


Sollzustand der Verzeichnisse (RICHTIGES ERGEBNIS)
<code type=“plain“>
3648 - Blumenvase lila
3649 - Duschkopf blau
3650 - Duschkopf CHROM
3651 - Abflußrohr
3652 - Blumenvase grün


Ich bin mir nicht sicher, ob die Batch eventuell Probleme damit hat, dass kurzfristig die Nummern nicht mehr 1x, sondern doppelt vorhanden ist, z.B 3648.

Damit sich die „Nummern“ während des Umbenennungs-Prozesses nicht behindern, ist es vielleicht unumgänglich die ursprüngliche Nummerierung von 4 Stellen auf 5 Stellen zu erhöhen? Ich bin mir aber nicht sicher.

Ich habe Testweise bei den original Verzeichnisnamen den Nummernwert um eine „0“ ergänzt. Entsprechend auch in der Batch den Wert von 4 auf 5 erhöht.

Leider auch wieder ein falsches Ergebnis: face-sad
<code type=“plain“>
%b
36490 - Duschkopf blau
36500 - Blumenvase lila
36510 - Blumenvase grün
36520 - Abflußrohr


Hat jemand eine Idee wie man die Schwierigkeiten in den Griff bekommt?

<Ironie>
Bitte diesmal nur ernst gemeinte Lösungsvorschläge. face-wink
</Ironie>

Über ein positives Feedback würde ich mich freuen.

Viele Grüße
Andy
Mitglied: 60730
60730 Nov 09, 2009 at 18:24:01 (UTC)
Goto Top
naabend..

Jetzt mal ganz ganz ehrlich...

Damit sich die „Nummern“ während des Umbenennungs-Prozesses nicht behindern, ist es vielleicht unumgänglich die ursprüngliche Nummerierung von 4 Stellen auf 5 Stellen zu erhöhen? Ich bin mir aber nicht sich...

Das hat nicht nur was mit der Batch zu tun, sondern allgemein - kannst du keine Nummern "doppelt" benutzen - einer schreibt aus Gewohnheit die olle Nummer irgendwo rein und *flatsch* die neue "Bedeutung" greift..

Ich würde ja sogar aus der 4 Stelligen Nummer eine N1234 "Nummer" machen - aber wie gesagt - nehm es als konstruktive Kritik und denk dran eine Datenbank ist 1.0000 * besser und eigentlich ist eine DB genau für "sowas" gemacht...

Gruß

btw:

<Ironie>
Bitte diesmal nur ernst gemeinte Lösungsvorschläge. face-wink
</Ironie>

Bis jetzt kamen hier immer nur ernstgemeinte Vorschläge....
Aber wenn du magst - ich "könnte" auch gerne anders face-wink

Über ein positives Feedback würde ich mich freuen.

Wenn du damit meinst Bastla / Biber oder "andere als nichthelfende bekannte - stricken sich nen Testordner um dein "Konstrukt" auszuprobieren - verpack das ganze in ein Zip file und geb den Download Link her...
Aber nicht mehr heute.. UNd denk dran - das ist dein Job - nicht unserer face-wink
Member: bastla
bastla Nov 09, 2009 at 18:28:34 (UTC)
Goto Top
Hallo Andy!

Da der unmittelbar vor "b" im Alphabet aufscheinende Buchstabe nicht "n", sondern dann doch ein anderer ist, konnte das gar nicht klappen face-sad - mit der folgenden Zeile 8 sollten die Chancen deutlich besser stehen:
for /f "tokens=1* delims=;" %%a in ('findstr /b "!Nr:~,4!;" "%Liste%"') do set "Neu=%%b"
[Edit]
Noch besser müsste es werden (um auch der - realilstischen - Gefahr vorzubeugen, dass ein Ordner tatsächlich vorweg schon umbenannt wurde), wenn Du es mit dieser Version versuchst:
@echo off & setlocal enabledelayedexpansion
set "targetdir=." & REM  oder Verz. setzen z.B.  set "targetdir=C:\Temp"   
set "Liste=Inventarlisten(NEU).txt"  

pushd "%targetdir%"  
for /f "delims=" %%i in ('dir /b /ad') do (  
    set "Nr=%%~ni"  
    set Neu=
    for /f "tokens=1* delims=;" %%a in ('findstr /b "!Nr:~,4!;" "%Liste%"') do set "Neu=%%b"  
    if defined Neu (
        ren "%%i" "!Neu!"  
    ) else (
        echo Nicht umbenannt: %%i
    )
)
popd
[/Edit]

Grüße
bastla
Member: SamTrex
SamTrex Nov 09, 2009 at 22:46:36 (UTC)
Goto Top
Hi,
muß mich doch noch mal melden...
Nur so nebenbei, der "Konstruktive Vorschlag" von mir funktioniert einwandfrei. Ich habe nämlich genau das gemacht was timobeil gesagt hat.
Einzig hätte ich vielleicht dabei schreiben sollen das das ganze in VBS ist.

@bastla: Nichts für ungut, aber mit Batch kenn ich mich einfach nicht aus ...

Gruß Sam
Member: Andichrist
Andichrist Nov 11, 2009, updated at Oct 18, 2012 at 16:39:55 (UTC)
Goto Top
Hallo an Alle,

@bastla, Deine zweite Lösung klappt ganz gut. Jetzt werden nur noch die Umlaute „falsch“ übersetzt (ASCII-ANSI).

Für den erforderlichen Codepage-Wechsel gibt es von Dir schon eine Lösung.

Die Code-Zeilen müssen nur noch in die Batch eingefügt werden und schon funktioniert alles!


Vor der FOR-Schleife:

for /f "tokens=2 delims=:. " %%i in ('chcp') do set "CP=%%i"  
chcp 1252 >nul

und danach

chcp %CP% >nul


FERTIGE Batch:

@echo off & setlocal enabledelayedexpansion
set "targetdir=." & REM  oder Verz. setzen z.B.  set "targetdir=C:\Temp"   
set "Liste=abgleich.txt"  

pushd "%targetdir%"  
for /f "tokens=2 delims=:. " %%i in ('chcp') do set "CP=%%i"  
chcp 1252 >nul
for /f "delims=" %%i in ('dir /b /ad') do (  
    set "Nr=%%~ni"  
    set Neu=
    for /f "tokens=1* delims=;" %%a in ('findstr /b "!Nr:~,4!;" "%Liste%"') do set "Neu=%%b"  
    if defined Neu (
        ren "%%i" "!Neu!"  
    ) else (
        echo Nicht umbenannt: %%i
    )
)
chcp %CP% >nul
popd

Perfekt! face-smile

@ SamTrex: Mit Deine VBS-Lösung hast Du diese Hürde (Codepage-Wechsel) nicht zu nehmen. Danke für Deine „konstruktive“ VBS-Lösung face-smile. Die Kommentierungen sind sehr hilfreich!

Ich danke allen für die zahlreichen Beiträge!

Viele Grüße
Andy
Member: bastla
bastla Nov 11, 2009 at 11:05:05 (UTC)
Goto Top
Hallo Andy!

Danke für die Rückmeldung - nachdem Du die Umlautproblematik (war mir zwar aufgefallen, aber ich wusste nicht, in welchem Format Deine Liste erstellt ist) auch noch gelöst hast, bleibt eigentlich nur zu hoffen, dass in den Ordnernamen keine "!" enthalten sind (Stichwort "delayedExpansion") ... face-wink
@SamTrex
Gegen eine VBS-Lösung habe ich sicherlich keine Einwände (meine ersten hier geposteten Scripts waren auch generell in VBS geschrieben face-wink) - eigentlich habe ich auch erst hier (vor allem dank Bibers "Basisarbeit") entdeckt, wieviel mit Batch - in der CMD-Variante; die Möglichkeiten von "command.com" waren im Vergleich dazu doch sehr beschränkt - machbar ist.

Grüße
bastla
Member: Andichrist
Andichrist Nov 11, 2009 at 12:12:48 (UTC)
Goto Top
Zitat von @bastla:

bleibt eigentlich nur zu hoffen, dass in den Ordnernamen keine
"!" enthalten sind (Stichwort "delayedExpansion")
... face-wink

Ich danke Dir für den wertvollen Hinweis mit dem Ausrufezeichen. Denn in der Tat liegen einige Artikel bzw. Ordnernamen in spanischer, französischer und italienische Sprache vor und haben das „!“ auch in der Bezeichnung.

Das Problem kann ich aber einfach umschiffen indem ich aus allen Ordnernamen - bevor Deine Batch zum Einsatz kommt – das „!“ entferne. Ich darf es nur nicht vergessen! face-wink

Grüße und danke
Andy