minister05
Goto Top

Textdateien durchsuchen und einzelne Parameter ändern

Hallo zusammen!
Ich habe ein Problem welches ich alleine nicht gelöst bekomme…leider sind meine Kenntnisse im Bereich Batchprogrammierung nicht wirklich groß, daher hoffe ich hier Hilfe zu finden. Konkret geht es um folgende Aufgabe:

In einem Ordner1 existiert eine Grunddatei.txt
In einem weiteren Ordner2 existieren mehrere Testdateien.txt

Die Grunddatei sieht in etwa so aus:

;xxxxxxxxxxxxxxxx
;xxxxxxxxxxxxxxxx
;xxxxxxxxxxxxxxxxxx
;xxxx
;xxxxxxxxxxxxxx
PAR_1=
PAR_2=
;xxxxxxxxxxxxxxxxxxxx
;xxxxxxxxxxxxxxxxxxxxxxxxxx
;xxxxxxxxx
PAR_3=
PAR_4=
;xxxxxxxxxxxxxxxxxxx
;xxxxxxxxxxxxxxxxxxxxxxxx
;xxxxxxxxxxxx
;xxxxxxxx
PAR_5

Usw.

Eine Testdatei hat diesen Inhalt, wobei die Zahlen in jeder Testdatei unterschiedlich sind:

;xxxxxxxxxxxxxxxxxxxxxxxxxx
;xxxxxxxxx
PAR_3=0,1,0,2
PAR_4=0,5,4,32
;xxxxxxxxxxxxxxxxxxx
;xxxxxxxxxxxxxxxxxxxxxxxx

Es soll jetzt jeweils die aktuelle Testdatei durchsucht werden nach Zeilen die nicht mit “;“ anfangen. Diese Zeilen sollen bis einschließlich dem Gleichheitszeichen übernommen werden und mit der Grunddatei verglichen werden. Anschließend sollen die Parameter genau an die richtige Stelle in der Grunddatei geschrieben werden (inkl. Zahlen). Das Endergebnis, welches separat abgespeichert werden soll, muss dann so aussehen:
;xxxxxxxxxxxxxxxx
;xxxxxxxxxxxxxxxx
;xxxxxxxxxxxxxxxxxx
;xxxx
;xxxxxxxxxxxxxx
PAR_1=
PAR_2=
;xxxxxxxxxxxxxxxxxxxx
;xxxxxxxxxxxxxxxxxxxxxxxxxx
;xxxxxxxxx
PAR_3=0,1,0,2
PAR_4=0,5,4,32
;xxxxxxxxxxxxxxxxxxx
;xxxxxxxxxxxxxxxxxxxxxxxx
;xxxxxxxxxxxx
;xxxxxxxx
PAR_5

Damit wäre Testfall1 fertig. Analog soll danach mit allen weiteren Dateien verfahren werden, die in diesem Ordner mit “Testfall“ beginnen, so dass am Ende folgendes im Ordner zu finden ist.

In Ordner1 existiert weiterhin die Grunddatei.txt

In Ordner2 existieren: Testdatei1.txt
Testdatei2.txt
Testdatei3.txt
Testdatei4.txt
TestNeu1.txt
TestNeu2.txt
TestNeu3.txt
TestNeu4.txt

Die Grunddatei muss so flexibel sein, dass ich sie für jeden beliebigen Ordner mit Testfällen verwenden kann, daher ist es so umständlich…also immer Zugriff auf Unterordner, Datei laden, schauen welche Parameter zu ändern sind und erst dann zurück in die Grunddatei und dort entsprechend ändern und unter neuem Namen abspeichern. Weiß jemand Rat?

Content-Key: 218273

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

Printed on: April 23, 2024 at 09:04 o'clock

Member: Endoro
Endoro Oct 02, 2013 at 00:42:12 (UTC)
Goto Top
Zitat von @Minister05:
Weiß jemand Rat?

Hi, klar doch ! face-smile
@echo off &setlocal
set "gfile=Ordner1\Grunddatei.txt"  
del "Ordner2\TestNeu*.txt" 2>nul  
for %%a in (Ordner2\Testdatei*.txt) do (
	set /a cnt+=1
	for /f "delims==" %%b in ('^<"%gfile%" find "="') do set "%%b="  
	for /f %%b in ('^<"%%~a" find "="') do set "%%~b"  
	for /f "delims=" %%c in ('findstr /n "^" "%gfile%"') do (  
		set "line=%%c"  
		set "prop="  
		setlocal enabledelayedexpansion
		set "line=!line:*:=!"  
		for /f "eol==delims==" %%d in ("!line!") do set "prop=%%d"  
		if "!line!" neq "!prop!" for /f %%d in ('set "!prop!" 2^>nul') do set "line=%%d"  
		>>"Ordner2\TestNeu!cnt!.txt" echo(!line!  
		endlocal
	)
)
type "Ordner2\TestNeu*.txt"  
lg.
Member: Minister05
Minister05 Oct 02, 2013 at 07:29:04 (UTC)
Goto Top
Also zunächst mal vielen Dank für die schnelle Hilfe!!Es läuft auch soweit,macht was es machen soll. Nur leider macht es auch zwei Sachen die es nicht machen soll...

Zum einen macht es in einer Zeile aus einem

VS=
ein
VSEDEFLOGDIR=C:\ProgramData\McAfee\DesktopProtection

zum anderen hab ich eine Zeile in der Grunddatei wo nicht PAR_*= steht sondern nur PAR=
Daraus macht er natürlich dann auch den Wert der in der Testdatei steht...

Kann man da was dran machen?
Member: Endoro
Endoro Oct 02, 2013 at 10:22:36 (UTC)
Goto Top
Hi, ich habe eine Prise Regex reingemischt. Aber es wird auch langsamer so. Falls es zu langsam ist, solltest du das anders lösen, zB mit awk.
@echo off &setlocal
set "gfile=Ordner1\Grunddatei.txt"  
del "Ordner2\TestNeu*.txt" 2>nul  
for %%a in (Ordner2\Testdatei*.txt) do (
	set /a cnt+=1
	for /f "delims==" %%b in ('findstr /brc:"PAR_[0-9][0-9]*=" "%gfile%"') do set "%%b="  
	for /f %%b in ('findstr /brc:"PAR_[0-9][0-9]*=" "%%~a"') do set "%%~b"  
	for /f "delims=" %%c in ('findstr /n "^" "%gfile%"') do (  
		set "line=%%c"  
		set "prop="  
		setlocal enabledelayedexpansion
		set "line=!line:*:=!"  
		if "!line:~-1!"=="=" for /f %%d in ('echo "!line:~0,-1!"^|findstr /brc:"\"PAR_[0-9][0-9]*\""') do set "prop=%%~d"  
		if defined !prop! for /f %%d in ('set "!prop!"') do set "line=%%d"  
		>>"Ordner2\TestNeu!cnt!.txt" echo(!line!  
		endlocal
	)
)
type "Ordner2\TestNeu*.txt"  
lg.
Member: Minister05
Minister05 Oct 02, 2013 at 12:31:49 (UTC)
Goto Top
Hmmm....
Jetzt schreibt er allerdings auch den Parameter nicht mehr in die TestNeu*.txt, den ich geändert haben wollte, sondern das Ergebnis ist gleich der Grunddatei.txt
Member: Endoro
Endoro Oct 02, 2013 at 14:45:00 (UTC)
Goto Top
Hi, also: funktioniert hier. Bitte auf c&p-Fehler, Pfade usw. überprüfen.
Sessionfoto
lg.
Member: Minister05
Minister05 Oct 14, 2013 at 12:25:21 (UTC)
Goto Top
Hi, sorry war letzte Woche unterwegs...also die Datei läuft, zumindest das Beispiel was ich eingestellt habe...in meiner Originaldatei heißen die Parameter jedoch nicht PAR_1 usw sondern PS1_VAR= und PS2_VAR=

Dachte das macht keinen Unterschied, aber anscheinend wohl doch...hab jetzt in den Zeilen
6, 7 und 13 deines Programms folgendes geändert:

@echo off &setlocal
set "gfile=Ordner1\Grunddatei.txt"
del "Ordner2\TestNeu*.txt" 2>nul
for %%a in (Ordner2\Testdatei*.txt) do (
set /a cnt+=1
for /f "delims==" %%b in ('findstr /brc:"*_[A-Z][A-Z]=" "%gfile%"') do set "%%b="
for /f %%b in ('findstr /brc:"*_[A-Z][A-Z]=" "%%~a"') do set "%%~b"
for /f "delims=" %%c in ('findstr /n "^" "%gfile%"') do (
set "line=%%c"
set "prop="
setlocal enabledelayedexpansion
set "line=!line:*:=!"
if "!line:~-1!"=="=" for /f %%d in ('echo "!line:~0,-1!"^|findstr /brc:"\"*_[A-Z][A-Z]\""') do set "prop=%%~d"
if defined !prop! for /f %%d in ('set "!prop!"') do set "line=%%d"
>>"Ordner2\TestNeu!cnt!.txt" echo(!line!
endlocal
)
)
type "Ordner2\TestNeu*.txt"


Doch leider läuft das nicht, er speichert als neue Dateien wie zuvor beschrieben quasi eine Kopie der Grunddatei neu ab...bin hier echt langsam am verzweifeln
Member: Endoro
Endoro Oct 14, 2013 at 22:21:47 (UTC)
Goto Top
Hi, dein regulärer Ausdruck ist ungültig.
PS1_VAR= und PS2_VAR=
PS[0-9][0-9]*_VAR=
lg.
Member: Minister05
Minister05 Oct 15, 2013 at 04:27:00 (UTC)
Goto Top
Hi und guten morgen!
Danke dass du dich so rührend um mich kümmerst...inzwischen schreibt die Batch alles richtig in die Grunddateiface-smile
Das einzige was noch stört ist, dass an einer Stelle, nämlich beim Parameter der Form

OS=
am Ende
OS=WINDOWS_NT
steht...

wenn ich das noch weg bekäme, wäre es P*E*R*F*E*K*T

Die Batch sieht jetzt so aus


@echo off &setlocal
set "gfile=Ordner1\Grunddatei.txt"
del "Ordner2\TestNeu*.txt" 2>nul
for %%a in (Ordner2\Testdatei*.txt) do (
set /a cnt+=1
for /f "delims==" %%b in ('^<"%gfile%" findstr "[A-Z]*_[A-Z]*="') do set "%%b="
for /f %%b in ('^<"%%~a" findstr "[A-Z]*_[A-Z]*="') do set "%%~b"
for /f "delims=" %%c in ('findstr /n "^" "%gfile%"') do (
set "line=%%c"
set "prop="
setlocal enabledelayedexpansion
set "line=!line:*:=!"
if "!line:~-1!"=="=" for /f "eol==delims==" %%d in ("!line!") do set "prop=%%~d"
if defined !prop! for /f %%d in ('set "!prop!"') do set "line=%%~d"
>>"Ordner2\TestNeu!cnt!.txt" echo(!line!
endlocal
)
)
Member: Minister05
Minister05 Oct 15, 2013 at 11:03:21 (UTC)
Goto Top
So...läuft jetzt...auch ohne den WINDOWS_NT Quatsch...

@echo off &setlocal
set "gfile=Ordner1\Grunddatei.txt"
del "Ordner2\TestNeu*.txt" 2>nul
for %%a in (Ordner2\Testdatei*.txt) do (
set /a cnt+=1
for /f "delims==" %%b in ('^<"%gfile%" findstr "[A-Z]*_[A-Z]*="') do set "%%b="
for /f %%b in ('^<"%%~a" findstr "[A-Z]*_[A-Z]*="') do set "%%~b"
for /f "delims=" %%c in ('findstr /n "^" "%gfile%"') do (
set "line=%%c"
set "prop="
setlocal enabledelayedexpansion
set "line=!line:*:=!"
if "!line:~-1!"=="=" for /f %%d in ('echo "!line:~0,-1!" ^|findstr "[A-Z]*_[A-Z]*"') do set "prop=%%~d"
if defined !prop! for /f %%d in ('set "!prop!"') do set "line=%%~d"
>>"Ordner2\TestNeu!cnt!.txt" echo(!line!
endlocal
)
)
type "Ordner2\TestNeu*.txt"

ENDLICH!!! VIELEN DANK!!!

Jetzt nur noch eine Schönheitsfrage....wenn ich die neue und die Grunddatei in Notepad++ schmeiße und vergleiche, würde ich gerne sehen, dass der geänderte Parameter nicht übereinstimmt. Müsste ja klappen, jedoch wird die komplette Datei als unterschiedlich angezeigt. Das Problem ist, dass in der neuen Datei TestNeu.txt an jedem Zeilenende ein Leerzeichen steht. Bekomme ich das noch weg?
Member: Endoro
Endoro Oct 15, 2013 at 18:35:48 (UTC)
Goto Top
Da sitzt wahrscheinlich ein Leerzeichen.
Ändere diese Zeile so ab:
>>"Ordner2\TestNeu!cnt!.txt" (echo(!line!)  

lg.
Member: Minister05
Minister05 Oct 16, 2013 at 04:31:59 (UTC)
Goto Top
Super, funktioniert perfekt!! Danke dir vielmals!!!!!