Batch für Textdatei, bestimmte Zeile suchen und ändern
Hallo,
ich weiß das ich unter Google etliche ähnliche Problemstellungen finde. Ich habe sie auch fast alle gelesen und auch etwas herum probiert. Nur leider reichen meine Batch Kenntnisse (habe erst die Tage mit Tutorials angefangen) nicht aus um das Ganze zum Laufen zu bringen.
Hier also mein Problem/Wunsch:
Ich habe mehrere Textdateien ( z.B.: Test1.txt, Test2.txt, Test3. usw.) welche Tabellen enthalten. Diese Dateien haben alle den gleichen Aufbau, unterscheiden sich nur durch bestimmte Werte. Da die Tabellen relativ groß und kompliziert sind, reicht zur Lösung meines Problems auch vereinfachte Form, z.B.:
Wert Bezeichnung
123 Geschwindigkeit
456 Anzahl
789 Preis
Jetzt möchte ich, dass in jeder Datei nur eine bestimmte Zeile gesucht und bearbeitet wird, in der z.B. die Bezeichnung ‘‘Anzahl“ steht. In dieser Zeile sollen z.B. nur die ersten drei Werte geändert werden die am Anfang dieser Zeile stehen, in diesem Falle 456 in z.B. 888.
Wert Bezeichnung
123 Geschwindigkeit
888 Anzahl
789 Preis
am besten Wäre es, wenn die Ausgangsdateien einfach geändert werden, also weder gelöscht noch neue Dateien erstellt werden. Jedoch wäre die Erstellung neuer Dateien nicht so tragisch.
Also zusammenfassend:
Parameter: "Bezeichnung", "neuer Wert"
Zeilen der Textdateien nach Bezeichnung durchsuchen, die ersten drei Stellen der bestimmten Zeile durch „neuer Wert“ ersetzen.
Wie gesagt, ich habe schon einige ähnliche Problemstellungen und Lösungen gefunden, wie z.B. das Ändern einer ganzen Zeile. Jedoch ist mir diese Suche am Anfang nach der Bezeichnung sehr wichtig sowie, dass nur ein bestimmter Teil der Zeile (hier die ersten Ziffern) geändert wird.
Ich hoffe ich habe alles soweit verständlich erklärt.
Wäre es wirklich dankbar wenn ihr mir etwas helfen könntet!
Lukas
ich weiß das ich unter Google etliche ähnliche Problemstellungen finde. Ich habe sie auch fast alle gelesen und auch etwas herum probiert. Nur leider reichen meine Batch Kenntnisse (habe erst die Tage mit Tutorials angefangen) nicht aus um das Ganze zum Laufen zu bringen.
Hier also mein Problem/Wunsch:
Ich habe mehrere Textdateien ( z.B.: Test1.txt, Test2.txt, Test3. usw.) welche Tabellen enthalten. Diese Dateien haben alle den gleichen Aufbau, unterscheiden sich nur durch bestimmte Werte. Da die Tabellen relativ groß und kompliziert sind, reicht zur Lösung meines Problems auch vereinfachte Form, z.B.:
Wert Bezeichnung
123 Geschwindigkeit
456 Anzahl
789 Preis
Jetzt möchte ich, dass in jeder Datei nur eine bestimmte Zeile gesucht und bearbeitet wird, in der z.B. die Bezeichnung ‘‘Anzahl“ steht. In dieser Zeile sollen z.B. nur die ersten drei Werte geändert werden die am Anfang dieser Zeile stehen, in diesem Falle 456 in z.B. 888.
Wert Bezeichnung
123 Geschwindigkeit
888 Anzahl
789 Preis
am besten Wäre es, wenn die Ausgangsdateien einfach geändert werden, also weder gelöscht noch neue Dateien erstellt werden. Jedoch wäre die Erstellung neuer Dateien nicht so tragisch.
Also zusammenfassend:
Parameter: "Bezeichnung", "neuer Wert"
Zeilen der Textdateien nach Bezeichnung durchsuchen, die ersten drei Stellen der bestimmten Zeile durch „neuer Wert“ ersetzen.
Wie gesagt, ich habe schon einige ähnliche Problemstellungen und Lösungen gefunden, wie z.B. das Ändern einer ganzen Zeile. Jedoch ist mir diese Suche am Anfang nach der Bezeichnung sehr wichtig sowie, dass nur ein bestimmter Teil der Zeile (hier die ersten Ziffern) geändert wird.
Ich hoffe ich habe alles soweit verständlich erklärt.
Wäre es wirklich dankbar wenn ihr mir etwas helfen könntet!
Lukas
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 175840
Url: https://administrator.de/forum/batch-fuer-textdatei-bestimmte-zeile-suchen-und-aendern-175840.html
Ausgedruckt am: 21.04.2025 um 12:04 Uhr
12 Kommentare
Neuester Kommentar

moin,
Naja -am besten wäre es - wenn es anders gehen würde zu Testzwecken immer neu schreiben statt zu ändern.
Aber Streng genommen, kann man(n) keine Dateien ändern, nur auslesen; Verarbeiten und neuschreiben.
besteht, und die gewünschte
Dann ist das doch die ganze Zeile.
Vorschlag meinerseits - du hast einige Treffer gefunden - welche?
Und wo hängt es?
Du schreibst die ganze Zeit was von Tabellen - sind das immer mit Leerzeichen getrennte Werte?
Willst du immer Die Zeile mit Anzahl ändern?
Gruß
am besten Wäre es, wenn die Ausgangsdateien einfach geändert werden, also weder gelöscht noch neue Dateien erstellt werden.
Naja -am besten wäre es - wenn es anders gehen würde zu Testzwecken immer neu schreiben statt zu ändern.
Aber Streng genommen, kann man(n) keine Dateien ändern, nur auslesen; Verarbeiten und neuschreiben.
Wie gesagt, ich habe schon einige ähnliche Problemstellungen und Lösungen gefunden, wie z.B. das Ändern einer ganzen Zeile.
- Hüstel, wenn die originalzeile aus
456 Anzahl
888 Anzahl
Dann ist das doch die ganze Zeile.
Vorschlag meinerseits - du hast einige Treffer gefunden - welche?
Und wo hängt es?
Du schreibst die ganze Zeit was von Tabellen - sind das immer mit Leerzeichen getrennte Werte?
Willst du immer Die Zeile mit Anzahl ändern?
Gruß
Hallo Overdue und willkommen im Forum!
Ersetzen hätten wir aktuell gerade hier in Arbeit - auf Basis des aktuellen Ansatzes von jeb-the-batcher und Deines Wunsches nach Übergabe per Parameter könnte das etwa so aussehen:
In diesem Fall wären 4 Parameter zu übergeben:
Der Aufruf könnte also etwa so erfolgen:
Eine kürzere (aber weniger übersichtliche) Fassung käme auch ohne eigens gesetzte Variablen aus:
Grüße
bastla
Ersetzen hätten wir aktuell gerade hier in Arbeit - auf Basis des aktuellen Ansatzes von jeb-the-batcher und Deines Wunsches nach Übergabe per Parameter könnte das etwa so aussehen:
@echo off & setlocal
set "Datei=%~1"
set "Bez=%~2"
set "Neu=%~3"
set "Anz=%~4"
set "Bak=%temp%\Bak.txt"
move "%Datei%" "%Bak%"
setlocal DisableDelayedExpansion
(
for /f "delims=" %%i in ('findstr /n "^" "%Bak%"') do (
set "Line=%%i"
setlocal EnableDelayedExpansion
set "Line=!Line:*:=!"
echo !Line!|findstr /e /c:" %Bez%">nul && (set "Line=%Neu%!Line:~%Anz%!")
echo(!Line!
endlocal
)
)>"%Datei%"
del "%Bak%"
- die zu bearbeitende Datei,
- die zu suchende Bezeichnung (für die vorausgesetzt wird, dass sie nach einem Leerzeichen am Zeilenende steht),
- der neue Wert und
- die Anzahl von Zeichen am Beginn der Zeile, die durch den neuen Wert ersetzt werden sollen
Der Aufruf könnte also etwa so erfolgen:
Ersetze.cmd "D:\Irgendein Ordner\Test1.txt" Anzahl 888 3
@echo off & setlocal
set "Bak=%temp%\Bak.txt"
move %1 "%Bak%"
setlocal DisableDelayedExpansion
(
for /f "delims=" %%i in ('findstr /n "^" "%Bak%"') do (
set "Line=%%i"
setlocal EnableDelayedExpansion
set "Line=!Line:*:=!"
echo !Line!|findstr /e /c:" %~2">nul && (set "Line=%~3!Line:~%~4!")
echo(!Line!
endlocal
)
)>%1
del "%Bak%"
bastla
Hallo Overdue!
Die verlinkte "fst"-Datei ist eine Textdatei, deren Spalten auf Basis der Zeichenanzahl entstehen - bei direktem Eintrag der Parameter (zum leichteren Testen, aber auch grundsätzlich als Option; bitte vor allem den Wert für "Bez" genau - am besten per c&p aus der Originaldatei - erfassen) ließe sich der Ansatz von oben zunächst für eine Datei eigentlich unverändert übernehmen:
Hier müsste nur noch die entsprechende Datei (auch per Drag & Drop möglich) übergeben werden. Sollen nun mehrere Dateien auf die selbe Art verändert werden, genügt eine zusätzliche Schleife:
Beide Ansätze sind (weitgehend) ungetestet ...
Kurz zum Ablauf:
Die äußere Schleife übernimmt aus dem Inhaltsverzeichnis ("
Noch als Anmerkung: Bei Verwendung von zB VBScript ließe sich die Verarbeitung um einiges beschleunigen ...
Grüße
bastla
P.S.: Spenden kannst Du zwar hier nix, aber in Fall des Falles findest Du sicher eine Möglichkeit, jemandem zu helfen ...
[Edit] Ergänzung: In beiden Varianten wird die Anzahl der zu ersetzenden Zeichen aus %Neu% ermittelt [/Edit]
Die verlinkte "fst"-Datei ist eine Textdatei, deren Spalten auf Basis der Zeichenanzahl entstehen - bei direktem Eintrag der Parameter (zum leichteren Testen, aber auch grundsätzlich als Option; bitte vor allem den Wert für "Bez" genau - am besten per c&p aus der Originaldatei - erfassen) ließe sich der Ansatz von oben zunächst für eine Datei eigentlich unverändert übernehmen:
@echo off & setlocal
set "Datei=%~1"
set "Bez=TMax - Total run time (s)"
set "Neu= 560.0"
set /a Anz=0 & set "Dummy=%Neu%"
:Loop
set /a Anz+=1
set "Dummy=%Dummy:~1%"
if defined Dummy goto :Loop
set "Bak=%temp%\Bak.txt"
move "%Datei%" "%Bak%"
setlocal DisableDelayedExpansion
(
for /f "delims=" %%i in ('findstr /n "^" "%Bak%"') do (
set "Line=%%i"
setlocal EnableDelayedExpansion
set "Line=!Line:*:=!"
echo !Line!|findstr /e /c:" %Bez%">nul && (set "Line=%Neu%!Line:~%Anz%!")
echo(!Line!
endlocal
)
)>"%Datei%"
del "%Bak%"
@echo off & setlocal
set "Ordner=D:\Der Ordner mit den fst-Dateien"
set "Bez=TMax - Total run time (s)"
set "Neu= 560.0"
set /a Anz=0 & set "Dummy=%Neu%"
:Loop
set /a Anz+=1
set "Dummy=%Dummy:~1%"
if defined Dummy goto :Loop
set "Bak=%temp%\Bak.txt"
pushd "%Ordner%"
for /f "delims=" %%d in ('dir /b /a-d *.fst') do (
echo Verarbeite: %%d
move "%%d" "%Bak%"
setlocal DisableDelayedExpansion
(
for /f "delims=" %%i in ('findstr /n "^" "%Bak%"') do (
set "Line=%%i"
setlocal EnableDelayedExpansion
set "Line=!Line:*:=!"
echo !Line!|findstr /e /c:" %Bez%">nul && (set "Line=%Neu%!Line:~%Anz%!")
echo(!Line!
endlocal
)
)>"%%d"
)
del "%Bak%"
popd
Kurz zum Ablauf:
Die äußere Schleife übernimmt aus dem Inhaltsverzeichnis ("
dir /b /a-d *.fst
") des per "pushd
" zum aktuellen Ordner gemachten %Ordner% jede einzelne Datei in die Schleifenvariable %%d
und führt damit die folgenden Verarbeitungsschritte durch:- Verschieben der Datei in eine Temporärdatei %Bak% (= Entfernen der Datei aus dem aktuellen Ordner bei gleichzeitigem Überschreiben einer bereits vorhandenen Temp-Datei)
- zeilenweises Einlesen der Temporärdatei (Genaueres dazu hat Beitrag beschrieben) und
- Ersetzen jener Zeile, welche mit der vorgegebenen Bezeichnung endet (aus Sicherheitsgründen, falls etwa eine Bezeichnung auch Teil einer anderen Bezeichnung wäre, wird damit der Suchbegriff genauer festgelegt), durch eine neu zusammengesetzte Zeile mit den Bestandteilen %Neu% (= neuer Wert) + alte Zeile nach der vorgegebenen Zeichenanzahl (also in diesem Fall ab dem 7. Zeichen) - %Neu% muss daher in der entprechenden Länge (inkl. Leerzeichen davor) angegeben werden
- Schreiben jeder Zeile in die (neu erstellte) Datei (%%d)
pushd
" (der Ordnung halber) mit "popd
" rückgängig gemacht.Noch als Anmerkung: Bei Verwendung von zB VBScript ließe sich die Verarbeitung um einiges beschleunigen ...
Besteht die Möglichkeit auch Verständnisfragen zu stellen?
Aber gerne ...Grüße
bastla
P.S.: Spenden kannst Du zwar hier nix, aber in Fall des Falles findest Du sicher eine Möglichkeit, jemandem zu helfen ...
[Edit] Ergänzung: In beiden Varianten wird die Anzahl der zu ersetzenden Zeichen aus %Neu% ermittelt [/Edit]
Hallo Overdue!
Wie versprochen eine Version, die deb Ersetzungsvorgang per VBScrpt (vom Batch selbst erzeugt) vornimmt:
Auch in dieser Version würde ich (aus Sicherheitsgründen) etwas mehr als nur die gewünschte Bezeichnung angeben (im Beispiel oben bis zum "-" am Ende der Spalte 2) - gesucht wird hier allerdings (auf Basis Deiner Beispieldatei und im Gegensatz zur Batchvariante) unmittelbar im Anschluss an die erste Spalte (deren Breite in Zeichen durch die Variable %Breite% vorgegeben werden muss).
Der neue Wert muss die gewünschte Anzahl an führenden Leerzeichen enthalten (zum Auffüllen der Spalte werden automatisch die auf %Breite% fehlenden Zeichen in Form von Leerzeichen hinzugefügt).
Weiterer Unterschied: Es wird "in der Datei" ersetzt, also ohne Erzeugung einer Temp-Datei unmittelbar die Ausgangsdatei verändert.
Grüße
bastla
Wie versprochen eine Version, die deb Ersetzungsvorgang per VBScrpt (vom Batch selbst erzeugt) vornimmt:
@echo off & setlocal
set "Ordner=D:\Der Ordner mit den fst-Dateien"
set "Bez=TMax -"
set "Neu= 560.0"
set "Breite=12"
set "R=%temp%\Replace.vbs"
>%R% echo Set fso=CreateObject("Scripting.FileSystemObject"):Set A=WScript.Arguments:T=fso.OpenTextFile(A(0)).ReadAll
>>%R% echo Set rE=New RegExp:rE.Pattern="(.{12})("^&A(1)^&")":fso.CreateTextFile(A(0)).Write rE.Replace(T,Left(A(2)^&Space(%Breite%),%Breite%)^&"$2")
pushd "%Ordner%"
for /f "delims=" %%d in ('dir /b /a-d *.fst') do (
echo Verarbeite: %%d
cscript //nologo %R% "%%d" "%Bez%" "%Neu%"
)
popd
Der neue Wert muss die gewünschte Anzahl an führenden Leerzeichen enthalten (zum Auffüllen der Spalte werden automatisch die auf %Breite% fehlenden Zeichen in Form von Leerzeichen hinzugefügt).
Weiterer Unterschied: Es wird "in der Datei" ersetzt, also ohne Erzeugung einer Temp-Datei unmittelbar die Ausgangsdatei verändert.
Grüße
bastla
Moin Overdue,
willkommen im Forum.
Falls du so etwas nicht kennst: zur Not nimm ein waldmeisterfarbenes.
Wir sind vielleicht technisch und bezogen auf Rechtschreibung nicht auf dem neuesten Stand, aber die rhetorischen Bauernfänger-Formulierungen aus der Kohl-Ära erkennen wir schon noch.
-> meine Empfehlung: wenn du ein Werkzeug wie VBScript nach einem Einarbeitungsaufwand von -ich sag mal- netto 10 Stunden halbwegs bedienen kannst, also quasi ab nächsten Freitag und dann 5 Jahre damit ausreichend klar kommst....
Was war noch mal die Frage?
Sonst nimm PowerShell .... ist zwar kryptisch, aber ist M$s momentaner Trendy-Tipp.
Grüße
Biber
willkommen im Forum.
Zitat von @Overdue:
Das klappt bisher reibungslos! Vielen vielen Dank. Damit hast du mich schon ein gutes Stück weiter gebracht.
Dann gehört nach den Grundregeln dieses Forums ein absinthfarbenes Häkchen an den Beitrag.Das klappt bisher reibungslos! Vielen vielen Dank. Damit hast du mich schon ein gutes Stück weiter gebracht.
Falls du so etwas nicht kennst: zur Not nimm ein waldmeisterfarbenes.
Nochmal zu meiner Frage: Was meinst du, auf welche Programmiersprachen ich mich für soclche Dinge konzentrieren sollte?
Ja nee, das merken wir hier, wenn du eine neue Frage stellst und das mit den Worten "Nochmal zu meiner Frage".Wir sind vielleicht technisch und bezogen auf Rechtschreibung nicht auf dem neuesten Stand, aber die rhetorischen Bauernfänger-Formulierungen aus der Kohl-Ära erkennen wir schon noch.
..., jedoch habe ich gelesen, das VBScript bald obselet sein soll.
- Definiere "gelesen". In der Computerbild? Im Kaffeesatz? Im Buch Salomons?
- Definiere "bald". Sagt dir das Datum 21.12.2011 im Maya-Kalender irgendwas? "Bald" gibt es auch kein Windows XP mehr und kein Windows 7. Und in 300 Jahren gibt es auch keine gesperrte Zone um Fukushima.
- Definiere "obsolet". Ist total out? Existiert nicht mehr? Wird nur noch von Sissis benutzt?
-> meine Empfehlung: wenn du ein Werkzeug wie VBScript nach einem Einarbeitungsaufwand von -ich sag mal- netto 10 Stunden halbwegs bedienen kannst, also quasi ab nächsten Freitag und dann 5 Jahre damit ausreichend klar kommst....
Was war noch mal die Frage?
Sonst nimm PowerShell .... ist zwar kryptisch, aber ist M$s momentaner Trendy-Tipp.
Grüße
Biber
@Biber
Danke für's Aushelfen - die Antwort war eigentlich schon überfällig ...
@Overdue
Ich schließe mich Biber vollinhaltlich an
- aber was das "Gar-nix-mehr-verstehen" angeht: Könntest Du das ev doch etwas einschränken und dann vielleicht eine konkrete Frage stellen?
Grüße
bastla
P.S.:
[Totally OT]
Zum Thema "überfällig": Mein 11111. Kommentar (ist vorhin ganz unspektakulär nebenan gelandet) wäre eigentlich schon vor 8 Tagen dran gewesen ...
[/Totally OT]
Danke für's Aushelfen - die Antwort war eigentlich schon überfällig ...
@Overdue
Ich schließe mich Biber vollinhaltlich an
Grüße
bastla
P.S.:
[Totally OT]
Zum Thema "überfällig": Mein 11111. Kommentar (ist vorhin ganz unspektakulär nebenan gelandet) wäre eigentlich schon vor 8 Tagen dran gewesen ...
[/Totally OT]
[OT]
Moin Overdue,
danke für deine Antwort und deine Reaktion auf meinen Kommentar.
Eine Fussnote möchte ich noch anbringen zu der Neben-Frage, wie obsolet denn VBScript denn nun ist.
In dem von dir angeführten Wiki-Artikel wird zu diesem Aspekt auf einen Blog aus dem Jahr 2004 verwiesen.
Für mich ist beim Lesen allerdings die Essenz der damaligen Diskussion
Jetzt, 7 Jahre später, lässt sich nur hinzufügen: dass die nach meiner Wahrnehmung geringe Akzeptanz von WMIC, Powershell und ASP.NET wohl eher noch eine -wie Mutti Angie sagen würde - Restlaufzeitverlängerung bewirken wirkt.
Ich stehe jedenfalls zu meiner Behauptung oben, dass du mit VBScript noch schmerzfrei über die nächsten 5 Winter kommst.
Sofern es denn so viele für M$ gibt.
Grüße
Biber
[/OT]
Moin Overdue,
danke für deine Antwort und deine Reaktion auf meinen Kommentar.
Eine Fussnote möchte ich noch anbringen zu der Neben-Frage, wie obsolet denn VBScript denn nun ist.
In dem von dir angeführten Wiki-Artikel wird zu diesem Aspekt auf einen Blog aus dem Jahr 2004 verwiesen.
Für mich ist beim Lesen allerdings die Essenz der damaligen Diskussion
- VBScript ist "eingefroren" und wird nicht weiterentwickelt
- dementsprechend kann wirklich niemand behaupten, VBScript wird als das strategisch M$-Produkt gehandelt
- die hohe Akzeptanz allerdings wird eine langjährige Koexistenz mit Folgeprodukten bewirken.
Jetzt, 7 Jahre später, lässt sich nur hinzufügen: dass die nach meiner Wahrnehmung geringe Akzeptanz von WMIC, Powershell und ASP.NET wohl eher noch eine -wie Mutti Angie sagen würde - Restlaufzeitverlängerung bewirken wirkt.
Ich stehe jedenfalls zu meiner Behauptung oben, dass du mit VBScript noch schmerzfrei über die nächsten 5 Winter kommst.
Sofern es denn so viele für M$ gibt.
Grüße
Biber
[/OT]