Mit batch-script wert in b.txt durch wert aus a.txt ersetzen
Ersetzen eines Parameters an einer bestimmten Stelle in einer txt-Datei durch einen Parameter aus einer anderen txt-Datei
Hallo die Damen und Herren,
ich beschäftige mich betriebsbedingt mit Batch-Script. Genutzt wird es für eine Programmkopplung, also Programme ausführen und Werte aus Dateien hin und her kopieren. Genau da liegt auch das Problem.
Also, Werte aus Dateien auslesen schaffe ich mittlerweile schon.
Ich sitze seit 3 Tagen daran, in einer Datei Lag1.ein 5 Parameter zu ändern. Wenn ich einen schaffe, geht der rest ja von alleine.
Strategie:
die Zeile mit dem Parameter den ich ändern möchte aus Lag1.ein mit find auslesen>> var1=FRX = 134.45
Den neuen Wert lese ich aus der Datei Lagerkraft.txt aus>> kra1=FRX = 3455.34
Ich habe eine Funktion gefunden, die nun die Datei Lag1.ein zeilenweise ausliest und mit var1 vergleicht. wenn die Zeile ungleich var1 ist wird sie in eine datei Lag11.ein kopiert
Ist die Zeile = var1, wird var1 durch kra1 ersetzt und in Lag11.ein kopiert ...
Offensichtlich gibt es da aber probleme mit den Leerzeichen innerhalb der Variablen, das Ergebnis des Ersetzens ist:
= 134.45 FRX = 3455.34 = 134.45 (hab die Zeichenfolge nicht ganz genau im Kopf)
Meinen Code kann ich erst morgen Nachmittag posten, der liegt leider noch auf Arbeit.
Aber vielleicht hat jemand eine Idee was mein Problem ist. Ich gehe davon aus das mir lediglich Klammern, Anführungszeichen oder ähnliches fehlen um den ganzen 'String' zu vergleichen bzw zu ersetzen.
Für Hilfe bin ich sehr dankbar, damit ich mit meiner Bachelorarbeit endlich mal wieder vorrankomme.
Grüße
H. Esche
Hallo die Damen und Herren,
ich beschäftige mich betriebsbedingt mit Batch-Script. Genutzt wird es für eine Programmkopplung, also Programme ausführen und Werte aus Dateien hin und her kopieren. Genau da liegt auch das Problem.
Also, Werte aus Dateien auslesen schaffe ich mittlerweile schon.
Ich sitze seit 3 Tagen daran, in einer Datei Lag1.ein 5 Parameter zu ändern. Wenn ich einen schaffe, geht der rest ja von alleine.
Strategie:
die Zeile mit dem Parameter den ich ändern möchte aus Lag1.ein mit find auslesen>> var1=FRX = 134.45
Den neuen Wert lese ich aus der Datei Lagerkraft.txt aus>> kra1=FRX = 3455.34
Ich habe eine Funktion gefunden, die nun die Datei Lag1.ein zeilenweise ausliest und mit var1 vergleicht. wenn die Zeile ungleich var1 ist wird sie in eine datei Lag11.ein kopiert
Ist die Zeile = var1, wird var1 durch kra1 ersetzt und in Lag11.ein kopiert ...
Offensichtlich gibt es da aber probleme mit den Leerzeichen innerhalb der Variablen, das Ergebnis des Ersetzens ist:
= 134.45 FRX = 3455.34 = 134.45 (hab die Zeichenfolge nicht ganz genau im Kopf)
Meinen Code kann ich erst morgen Nachmittag posten, der liegt leider noch auf Arbeit.
Aber vielleicht hat jemand eine Idee was mein Problem ist. Ich gehe davon aus das mir lediglich Klammern, Anführungszeichen oder ähnliches fehlen um den ganzen 'String' zu vergleichen bzw zu ersetzen.
Für Hilfe bin ich sehr dankbar, damit ich mit meiner Bachelorarbeit endlich mal wieder vorrankomme.
Grüße
H. Esche
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 148654
Url: https://administrator.de/forum/mit-batch-script-wert-in-b-txt-durch-wert-aus-a-txt-ersetzen-148654.html
Ausgedruckt am: 30.04.2025 um 20:04 Uhr
13 Kommentare
Neuester Kommentar
Hallo Lowered!
Ich würde es geringfügig anders anlegen (und dabei gleich für "Lag2.ein", "Lag3.ein", etc - können dann über eine weitere Schleife verarbeitet werden - vorsorgen):
Ev ist
etwas erklärungsbedürftig: Damit wird der Variablen %zeile% je nach Inhalt von %%a der Variableninhalt von %X% oder %Y% oder %Z% zugewiesen - zur Veranschaulichung durch "_" getrennt geschrieben sähe der letzte Teil so aus: %%_%%a_%%, woraus wegen des "
Grüße
bastla
Ich würde es geringfügig anders anlegen (und dabei gleich für "Lag2.ein", "Lag3.ein", etc - können dann über eine weitere Schleife verarbeitet werden - vorsorgen):
@echo off & setlocal
set "quell_datei=Lag1.ein"
set "lager=Lagerkraft.txt"
REM Dateinamen (mit Pfad, aber ohne Typ) ermitteln
for %%i in ("%quell_datei%") do set "quell_datei_n=%%~dpni"
REM Dateinummer (=letzte Stelle des Namens) ermitteln
set "quell_datei_nr=%quell_datei_n:~-1%"
REM Zieldateinamen erzeugen
set "ziel_datei=%quell_datei_n%1.ein"
REM FR* entsprechend der Dateinummer auslesen (dabei Leerzeichen entfernen) und den Variablen %X%, %Y% und %Z% zuweisen
for /f "tokens=2-4 delims=; " %%a in ('findstr /b "L%quell_datei_nr%;" "%lager%"') do set "X=FRX = %%a" & set "Y=FRY = %%b" & set "Z=FRZ = %%c"
REM Loeschen der Ausgabedatei
del /f "%ziel_datei%" 2>nul
REM Quell-Datei zeilenweise auslesen, in Variable %zeile% schreiben und Verarbeitungs-Unterprogramm aufrufen
for /f "tokens=1* delims=:" %%i in ('findstr /n "^" "%quell_datei%"') do set "zeile=%%j" & call :ProcessLine
GOTO :weiter
:ProcessLine
REM Auf FR*-Zeile prüfen und ggf ersetzen
if defined zeile for %%a in (X Y Z) do echo %zeile%|findstr /b /c:"FR%%a =">nul && (echo %%a & call set "zeile=%%%%a%%")
REM Zeile in Zieldatei schreiben
>>"%ziel_datei%" echo\%zeile%
GOTO :eof
:weiter
REM weitere Verarbeitung
call set "zeile=%%%%a%%"
call
" dann eben (jetzt wieder ohne Trennzeichen) zB %X%
wird ...Grüße
bastla
Hallo Lowered!
Wenn in der "Lagerkraft.txt" die Zeilen weiterhin mit "L1", "L2", etc beginnen, wirst Du weiterhin auch das "L" in den Suchbegriff aufnehmen müssen - als Zeile 36 daher:
Da Du das Leerzeichen als "Delimiter" wieder entfernt hast, nehme ich an, dass Du die Schreibweise
<code type="plain>FRY = -0.04
der Variante
<code type="plain>FRY = -0.04
vorziehst ...
Die Zeilen 48 und 49 lassen sich übrigens wieder zusammenfassen (den Unterschied "FRX" zu "FAZ" hatte ich leider nicht berücksichtigt):
Den Rest habe ich mir nur oberflächlich angesehen; auf die jeweiligen "temp.txt" würde ich jedenfalls verzichten - etwa so:
wobei ich im Zweifelsfall zu "
Grüße
bastla
Wenn in der "Lagerkraft.txt" die Zeilen weiterhin mit "L1", "L2", etc beginnen, wirst Du weiterhin auch das "L" in den Suchbegriff aufnehmen müssen - als Zeile 36 daher:
for /f "tokens=2-4 delims=;" %%a in ('findstr /b "L%quell_datei_nr%;" "%lager%"') do set "X=FRX = %%a" & echo %X% & set "Y=FRY = %%b" & set "Z=FAZ = %%c"
<code type="plain>FRY = -0.04
der Variante
<code type="plain>FRY = -0.04
vorziehst ...
Die Zeilen 48 und 49 lassen sich übrigens wieder zusammenfassen (den Unterschied "FRX" zu "FAZ" hatte ich leider nicht berücksichtigt):
if defined zeile for %%a in (X Y Z) do echo %zeile%|findstr /b /r /c:"F[AR]%%a =">nul && (echo %%a & call set "zeile=%%%%a%%")
for /F "skip=2 tokens=4 delims=GM" %%a in ('find "RAD. VERLAGERUNG IN X-RICHTUNG" "%lag%work\LAGER2.AUS"') do @set "zeile1=%%a"
findstr
" anstelle von "find
" tendiere ...Grüße
bastla
Hallo Lowered!
ein ...
Abgesehen davon kannst Du das "
Grüße
bastla
in dem Bereich wo FRX, FRY und FAZ in die Datei kopiert werden sollen, läuft jetzt etwas falsch.
Eher nicht; den Fehler würde ich, so wie Du das ohnehin schon angedeutet hattest, beim Auslesen aus der "Lagerkraft.txt" (also in Zeile 36) suchen - füge doch einfach einmal danach eine Zeileecho %X%_%Y%_%Z% & pause
Abgesehen davon kannst Du das "
echo off
" in der ersten Zeile während der Testphase in ein "echo on
" änderrn und so dem Batch "beim Arbeiten zuschauen"; sinnvoll wäre es dazu auch, direkt von der Kommandozeile zu starten und vorweg über einen Klick links in der Titelleiste des CMD-Fensters die "Eigenschaften" und dort "Layout" aufzurufen und die Höhe der "Fensterpuffergröße" auf einen höheren Wert (ich verwende den Maximalwert 9999) zu setzen - so kannst Du entsprechend weit nach oben scrollen ...Grüße
bastla
Hallo Lowered!
Wenn die Nummer immer 2 Zeichen umfasst (für Werte unter 10 eben ein Leerzeichen vorweg), ließe sich das so lösen:
Hier wird zunächst vor die aus dem Dateinamen ausgelesene Nummer auf jeden Fall ein Leerzeichen gesetzt, dann aber das Ergebnis auf die letzten beiden Stellen beschränkt - dadurch kannst Du dann wieder ganz einfach nach %quell_datei_nr%" suchen ...
; beim Zeilenende ist das nicht so sicher - Stichwort "Windows-Zeilenschaltung CR + LF") - also etwas kürzer formuliert: Damit werden alle Zeilen der Datei erfasst und mit "/n" nummeriert - Zweck der Übung ist es, Leerzeilen, die ansonsten in einer "
Grüße
bastla
Wenn die Nummer immer 2 Zeichen umfasst (für Werte unter 10 eben ein Leerzeichen vorweg), ließe sich das so lösen:
set "quell_datei_nr= %quell_datei_n:~-1%"
set "quell_datei_nr=%quell_datei_nr:~-2%"
Was macht denn "°" ?
Falls Du damit "^" aus dem "findstr
" meinen solltest - der Hilfe kannst Du entnehmen, dass dieses Zeichen alternativ zu "/b" dazu verwendet werden kann, für die Suche "Zeilenposition: Anfang der Zeile" vorzugeben - in der konkreten Anwendung hat es einfach den Sinn, jede Zeile zu suchen, die einen Zeilenanfang hat (und das sollten nun wirklich alle vorkommenden Zeilen sein for /f
"-Schleife durch den Rost fallen, ebenfalls "mitzunehmen" ...Grüße
bastla