der-blob
Goto Top

Werte aus FOR-Schleife abfragen bzw. abfangen

Ich habe eine kleine Datei mit mehren Zeilen, ich muss die Zeilen mit verschiedenen sachen berechnen & ersetzen, dies ist auch kein problem, mit meiner folgenden lösung


.....
....
for /f "usebackq delims=" %%i in ("%alterdatei%") do (  
    for /f "tokens=2-4 delims=, " %%a in ("%%i") do (  
        set "Done="  
        if "%%a"=="WERT1"( echo 2%%b,9%%c, test42 )  
		set "Done=true"  
		)
        if "%%a"=="WERT2" (  
??? was muss hier rein?
		)
...

		)

Das ganze gerechne usw. klappt auch für jede zeile, jedoch ist das problem, das wenn

WERT2

in einer zeile steht ich diverse parameter aus WERT1 benötige.

datei sieht wie folgt aus:

WERT1
WERT1
irgendwas ....
WERT1
WERT2
WERT1
usw.

wenn ich nun WERT2 bearbeiten möchte muss der WERT1 welche _VOR_ WERT2 steht gelöscht werden! Und zudem benötige ich das %%b aus WERT1

p.s ist es möglich Rechnungen (cosinus / +/- ...) in der FOR schleife mit einzuarbeiten? - habe diese z.zt. nur seperat, wär halt nur ne "schönheitsanpassung" das mit den Rechnungen , dies ist aber nur eine optionale kleine frage am rande

Ich habe in der SUFU leider nichts genaues gefunden womit ich weiter komme... - vielleicht bin ich einfach nur zu blöd dafür :S - was ich nicht Hoffe.

Content-ID: 166259

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

Ausgedruckt am: 22.11.2024 um 19:11 Uhr

bastla
bastla 14.05.2011 um 12:44:52 Uhr
Goto Top
Hallo der-blob und willkommen im Forum!
muss der WERT1 welche _VOR_ WERT2 steht gelöscht werden!
Was meinst Du damit - aus der Datei gelöscht?

Ansonsten:
Und zudem benötige ich das %%b aus WERT1
Füge
  • am Anfang (möglichst ohne Tippfehler, wie es mir hier in der ersten Fassung gelungen war face-wink)
setlocal enabledelayedexpansion
  • nach Zeile 7
set "ParamB=%%b"
  • und im "WERT2"-Teil die benötigte Verarbeitung (als Beispiel nur eine Ausgabe)
echo !ParamB!
hinzu.
ist es möglich Rechnungen (cosinus / +/- ...) in der FOR schleife mit einzuarbeiten?
Was per CMD berechnet werden kann, siehst Du mit
set /?
ab
Die /A-Option gibt an ...
Grüße
bastla

P.S.: Falls Du nicht noch irgendwo die gesamte Zeile (also "%%i") am Stück brauchst, sollten sich eigentlich
for /f "usebackq delims=" %%i in ("%alterdatei%") do (  
    for /f "tokens=2-4 delims=, " %%a in ("%%i") do (  
zu
for /f "usebackq tokens=2-4 delims=, " %%a in ("%alterdatei%") do (  
zusammenfassen lassen ...
der-blob
der-blob 14.05.2011 um 15:02:57 Uhr
Goto Top
VIELEN HERZLICHEN DANK!!!!!
so ähnlich hatte ich es schon, nur da hatte mir das
enabledelayedexpansion
gefehlt!
zwecks mit den SET rechnen habe ich schon drin gehabt, nur anderer stelle, nun klappt dies auch - war nen fehler meiner seits.


und das mit dem wert löschen, die datei enthält ja mehrfach WERT1 - dieser soll auch drinne bleiben jedoch wenn WERT2 folgt soll wert1 gelöscht werden:

vorher:

WERT1
WERT1
irgendwas ....
WERT1
WERT2
WERT1
usw.

nacher:
WERT1
WERT1
irgendwas ....
WERT2
WERT1
usw.


der WERT! welcher in der Zeile vor WERT2 steht soll komplett (also ganze zeile) gelöscht werden, ich bekomm das nur hin das er immer immer ALLE zeilen mit WERT1 löscht, jedoch nicht nut die , welche WERT2 als folgezeile haben.

denn wenn ich über findstr gehe und die zeilen in extra bzw. neue datei schreibe übernimmt er ja auch die WERT1 zeilen welche vor WERT2 zeilen stehen...

ich hoffe ich habe es nun verständlich geschrieben.
bastla
bastla 14.05.2011 um 18:09:04 Uhr
Goto Top
Hallo der-blob!

Etwa so (mit Deinem "vorher"-Beispiel als Inhalt der "Vorher.txt" kurz getestet):
@echo off & setlocal
set "Ein=Vorher.txt"  
set "Aus=Nachher.txt"  
set "Suche1=WERT1"  
set "Suche2=WERT2"  

set "Zeile="  
del "%Aus%" 2>nul  
for /f "tokens=1* delims=:" %%i in ('findstr /n "^" "%Ein%"') do call :ProcessLine "%%j"  
if defined Zeile >>"%Aus%" echo %Zeile%  
goto :eof

:ProcessLine
echo %1|findstr "%Suche2%">nul && goto :Ausgabe  
if defined Zeile >>"%Aus%" echo %Zeile%  
echo %1|findstr "%Suche1%">nul && (  
    set "Zeile=%~1"  
    goto :eof
)
:Ausgabe
>>"%Aus%" echo\%~1  
set "Zeile="  
goto :eof
Es wird für jede Zeile (auch wenn es eine Leerzeile ist) der "%Ein%"-Datei das Unterprogramm ":ProcessLine" mit Übergabe der Zeile (unter Anführungszeichen) als Parameter %1 aufgerufen.

Wenn diese Zeile "WERT2" enthält (falls die Überprüfung auf "nur aus WERT2 besteht" vorzunehmen wäre, könnte als Zeile 14
if %1=="%Suche2%" goto :Ausgabe
verwendet werden), wird sie ausgegeben und eine ev zwischengespeicherte Zeile (%Zeile%) mit "WERT1" wird verworfen.

Enthält die Zeile nicht "WERT2", wird zunächst eine ev zwischengespeicherte Zeile (%Zeile%) ausgegeben.

Dann wird geprüft, ob die aktuelle Zeile "WERT1" enthält; wenn ja, wird die Zeile zwischengespeichert und die Verarbeitung beendet (= Rücksprung aus dem Unterprogramm mit "goto :eof").

Enthält die aktuelle Zeile nicht "WERT1", wird sie ausgegeben und eine ev zwischengespeicherte Zeile gelöscht (wurde ja bereits ausgegeben oder ohnehin nicht benötigt).
Anzumerken wäre noch, dass Du Dich hinsichtlich des Inhaltes der Zeilen sehr bedeckt gehalten hast und ich daher nicht weiß (und nicht berücksichtigen konnte) , ob/dass zB eine Zeile mit einem ":" beginnt oder Sonderzeichen enthält ...

Grüße
bastla
der-blob
der-blob 14.05.2011 um 18:26:01 Uhr
Goto Top
vielen herzlichen dank, klappt 100%ig

und vielen dank für die schnelle antwort, dir noch ein schönes wochenende

grüße, der blobface-smile