ican1985
Goto Top

Mit Batch aus einer TXT Werte ZEILENWEISE auslesen als Variablen verwenden in einer For-Schleife

Hallo,

ich habe nach längerer Suche aufgegeben im Internet gibt es zwar viele Lösungen, aber ich habe es nicht geschafft mir eine zusammenzuschustern. Nun bitte ich euch mir zu helfen.

Also es geht darum das ich eine Datei TXT oder CSV ist eigentlich egal, deren Werte mit ";" voneinander getrennt sind zeilenweise einlesen will.

Die Werte liegen in folgender Form vor, bei mir als TXTface-sadA,B,C,D,E)
1;29.0;5.0;0.0;1.0;
2;30.5;2.925;0.0;24.03;
3;31.5;3.7;3.0;41.18;
4;50.0;3.625;1.56;50.0;
5;0.0;0.1;0.0;31.38; <<-----------
6;5.0;0.325;0.305095852;1.0;
7;26;3.775;1.65;30.4;
8;0.0;1.15;1.95;14.23;
..
..
(insgesamt 50 Zeilen)

ICH WILL: Ich will am besten aus einer Datei eine Zeile die Werte (A,B,C,D,E) übergeben mit diesen eine Simulation starten und nach der Simualtion die nächsten 5 Werte in der nächsten Zeile verwenden usw.
Also ich will nur eine Zeile mit den Variablen A,B,C,D und E verwenden und nicht 50 mal diese unten aufgeführte innere For Schleife verwenden.
Das will ich realisieren.

Dazu habe ich mir eine Test-Datei erstellt:

@echo off
ECHO TEST > INFO.txt
For /L %%k IN (1,1,4) DO (
For /F "tokens=1-5 delims=;" %%a in ('findstr /n . "DesignExp_excel.txt"^|findstr "^%%k:"') do (
set Sl=%%b
set Ss=%%c
set Y=%%d
set b=%%e
ECHO %Sl%,%b% >> INFO.txt)
)

Beim ausführen dieser Datei gibt er mir folgendes aus:
TEST
0.0,31.38
0.0,31.38
0.0,31.38
0.0,31.38

Er gibt mir also die richtigen Werte der 5ten Zeile aus (siehe Pfeil oben) und das 4 mal. ??????
Das verstehe ich nicht was mache ich falsch????
Die innere For-Schleife alleine funktioniert ohne angegebene Varibale %%k, aber mit der äußeren Schleife nicht. Ich könnte jetzt diese innere Schleife 50 mal ausführen was, aber sehr unelegant und aufwändig.

Im Internet steht zwar viel, aber nichts was mich auf eine Lösung bringen könnte.
Wenn jemand Verbesserungsvorschläge hat oder Kritik nur zu ich freue mich über jede Antwort. Bitte um Hilfe zur Lösung.

Gruß

Content-Key: 187165

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

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

Member: c0rtex
c0rtex Jun 27, 2012 updated at 14:05:05 (UTC)
Goto Top
Hallo iCan1985,

das Problem ist deine FOR-Schleife.

"For /L %%k IN (1,1,4) DO"

(1,1,4) bedeutet:

Die erste 1 ist der "Startwert" deiner Zählvariable k. Die zweite 1 bezeichnet den Wert, um den die Zählvariable k nach jedem
Schleifendurchlauf inkrementiert (=erhöht) wird. Die 4 ist der "Grenzwert" -> wenn deine Zählvariable k diesen Wert erreicht, springt das Programm aus der Schleife heraus.

-> Zusammenfassung: Die Schleife wird vier Mal durchlaufen (= 4x "ECHO %Sl%,%b% >> INFO.txt")

Gruß Ivo


PS: Den Rest habe ich mir noch nicht angesehen, da ich momentan ziemlich wenig Zeit habe. Bin nur kurz drübergeflogen ;)
Member: bastla
bastla Jun 27, 2012 at 14:03:09 (UTC)
Goto Top
Hallo iCan1985 und willkommen im Forum!

In den meisten derartigen Fällen ist die Zuweisung an eigene Variablen nicht nötig - hier sollte eigentlich
@echo off & setlocal
echo TEST>INFO.txt
for /F "tokens=1-5 delims=;" %%a in (DesignExp_excel.txt) do (  
    >>INFO.txt echo %%b,%%e   
)
reichen ...

Grüße
bastla
Member: iCan1985
iCan1985 Jun 27, 2012 at 14:13:56 (UTC)
Goto Top
Hallo Ivo alias c0rtex,

vielen dank das du schon mal rübergeschaut hast. Das mit der For-Schleife ist mit klar das ist ja auch meine Absicht das sie das tut. Der Kasus knaktus liegt in der zweiten For-Schleife dort ist ein "%%k%" (Var der ersten For-Schleife enthalten) die in Verbindung mit dem Findstr ZITAT: ^|findstr "^%%k:"' die k-te Zeile ausgibt. Das funktioniert auch wenn ich keine Variable, sondern einen Wert reinschreibe. Meine Absicht ist nun diesen Wert als Variable zu haben, damit ich nicht 50 mal diese For-Schleife schreiben muss.

Viele Grüße

iCan
Member: bastla
bastla Jun 27, 2012 at 14:21:53 (UTC)
Goto Top
Hallo iCan1985!

So ganz klar ist mir noch nicht, was Deine eigentliche Zielsetzung ist: Wenn Du ohnehin jede Zeile der Ausgangsdatei verarbeiten willst, brauchst Du dafür ja nicht die Auswahl der "k-ten Zeile" ...

Grüße
bastla
Member: iCan1985
iCan1985 Jun 27, 2012 at 14:22:44 (UTC)
Goto Top
Hallo Bastla,

vielen dank schon mal für deine Hilfe. Meine Absicht ist nicht eine Spalte auszulesen was ich mit deinem Befehl ja auch erreichen würde, sondern ich will nur von einer Zeile den Bten und Eten Wert rauslesen und weiterverwenden. Deswegen mache ich auch beabsichtigt diese Zuweisung mit einer Variablen damit ich diese dann später verwenden kann. Mein Problem ist nun, dass ich es nicht hinbekomme, dass die eine For-Schleife mir meine Variablen aus einer txt ausliest und ich diese dann weiterverwenden kann. Die zweite For-Schleife dient nun dazu, dass ich die andere nicht 50 -mal eintippen muss. ODer weißt du eine andere Lösung für mein Problem.

Viele Grüße und dank

iCan
Member: bastla
bastla Jun 27, 2012 updated at 14:32:12 (UTC)
Goto Top
Hallo iCan1985!
Meine Absicht ist nicht eine Spalte auszulesen was ich mit deinem Befehl ja auch erreichen würde,
Mein Ansatz liefert für jede Zeile den Wert der 2. und 5. Spalte, und was immer Du damit anstellen willst, wird vermutlich auch direkt über "%%b" und "%%e" (also ohne Zuweisung an eine weitere Variable) zu machen sein - Du könntest die weitere Verwendung der beiden Werte ja aber mal kurz darstellen ...

Grüße
bastla
Member: iCan1985
iCan1985 Jun 27, 2012 at 14:34:27 (UTC)
Goto Top
Hallo bastla,

ich bin Ohr für deinen Vorschlag was soll ich tun, um jede Zeile einzeln anzusprechen. Ich fände es ja super, wenn es einen Befehl gäbe, wo ich sage lese aus txt Zeile 15 aus und zwar den 2ten und 4ten Wert und weise ihn einer VAriable zu. Aber solch einen Befehl konnte ich nicht detektieren. Vllt habe ich auch nach etwas falschem gesucht.

Danke und Gruß

Can
Member: iCan1985
iCan1985 Jun 27, 2012 at 14:43:30 (UTC)
Goto Top
Hallo bastla das geht aber fix,

vielen dank für deine Hilfe. Also mein Problem ist nur mit deinem Anstaz wie kriege ich denn das hin das der Variable %%b %%c etc den 2ten,3ten, 4ten, etc Wert der 15ten Zeile zugewiesen. Die Werte sollen später in eine extra TXT Datei geschrieben werden, der von einem FEM Programm verwendet wird. Diese ruft das FE Programm bei jeder Simulation auf und führt sie aus. Sollte die Simualtion durch sein, so will ich die Werte der nächsten Zeile verwenden, die vorhandene TXT Datei überschreiben mit den neuen Werten und die Simulation erneut durchführen. Ich versuche gerade diese Prozedere zu automatisieren mit eienr Batch. Ich hoffe die Erläuterungen reichen dir.

Gruß udn Dank

Can
Member: bastla
bastla Jun 27, 2012 at 14:44:48 (UTC)
Goto Top
Hallo iCan1985!

Wenn es tatsächlich um einzelne Zeilen gehen sollte, musst Du natürlich zuerst festlegen, welche Zeile das sein soll, daher etwa:
@echo off & setlocal
set /p Zeile=Welche Zeile?
for /f "tokens=1-5 delims=;" %%a in ('findstr /n . "DesignExp_excel.txt"^|findstr "^%Zeile%:"') do (  
    echo In Zeile %Zeile% stehen die Werte %%b und %%e
)
Sollte Deine Datei aber, wie Dein Beispiel oben vermuten lässt, sogar ohnehhin schon in Spalte 1 eine laufende Nummer haben, ließe sich die Zeile 3 noch auf
for /f "tokens=1-5 delims=;" %%a in ('findstr "^%Zeile%;" "DesignExp_excel.txt"') do (
vereinfachen ...

Grüße
bastla
Member: bastla
bastla Jun 27, 2012 updated at 14:53:53 (UTC)
Goto Top
Hallo iCan1985!

Wenn alle Zeilen (früher oder später, aber in der Reihenfolge, in der sie in der Datei stehen) verarbeitet werden sollen, genügt doch aber die Schleife aus meinem oberen Ansatz - anstelle der Zeile 4 kannst Du ja alle nötigen Schritte einfügen, also etwa
>INFO.txt echo %%b,%%e
"D:\Pfad\FEM Programm"  
echo Programm fertig fuer %%b,%%e
pause
- damit würde also jeweils die "INFO.txt" neu erstellt, danach das "FEM Programm" ausgeführt und nach Ende des Programms eine Meldung ausgegeben und auf einen Tastendruck gewartet werden, bevor dann die nächste Zeile der Textdatei ausgelesen und verarbeitet würde ...

Grüße
bastla
Member: iCan1985
iCan1985 Jun 28, 2012 at 08:37:55 (UTC)
Goto Top
Hallo bastla,

vielen dank nochmal für deinen Support hier. Also deine Anmerkungen sind super und helfen mir weiter. Jetzt bräuchte ich nur eine Info um mein Problem zu lösen, und zwar will ich deinen Befehl

for /f "tokens=1-5 delims=;" %%a in ('findstr "^%Zeile%;" "DesignExp_excel.txt"') do (

so umändern, dass ich die Variable Zeile nicht definiere mit "set", sondern die von der For-Schleifen Variablen generiert wird. Sollte ich das machen funktioniert nichts mehr. Er schriebt mir nur TEST raus ????. Hier der Quellcode den ich meine:

echo off & setlocal
echo TEST>INFO.txt
For /L %%u IN (1,1,5) Do (
for /F "tokens=1-5 delims=;" %%a in ('findstr "^%%u;" "DesignExp_excel.txt"') do (
set Sl=%%b
set Ss=%%c
set Y=%%d
set b=%%e
echo %%b,%%e >> INFO.txt)
)

Wie kann ich das Problem jetzt lösen. Ich habe jetzt schon wieder vieles ausprobiert. Ich hoffe ich konnte mein Problem schildern und es ist klar geworden.

Vielen Dank und Gruß
iCan
Member: iCan1985
iCan1985 Jun 28, 2012 at 08:49:19 (UTC)
Goto Top
Hallo bastla,

der letzte Post tut mir leid ich dachte ich hätte das ausprobiert. Naja jedenfalls was ich da gepostet habe ist genau das was ich haben wollte und das wichtigste es funktioniert. Habe es gerade mit verschiedenen Variationen ausporbiert.
Vielen dank an dich un deiner Zeit warst mir eine große Hilfe.

viele Grüße und dank
glücklicher iCan