wickie666
Goto Top

mehrere Zeilen auslesen und zu einer zusammenfassen

Ich möchte aus einer Textdatei die Zeileneinträge auslesen und diese in einer Variablen zwischenspeichern und dann mittels for-schleife in eine Textdatei schieben.

set line=
FOR /f "delims=" %%f IN (MODULES.txt) DO set line=%line% %%f
echo %line% >>sortiert.txt


Im Grunde nichts schweres, nur leider macht die for-schleife Probleme. Ich verstehe nicht, warum ich immer nur den letzten Eintrag der TXT Datei aufgelistet bekomme.
Also in wenn in der MODULES.txt die Eintrage
1
2
3
stehen, wird nur 3 in der sortiert.txt aufgeführt.
Ich will aber
1 2 3
dort stehen haben!
Wo liegt mein fehler?

Content-Key: 51018

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

Ausgedruckt am: 29.03.2024 um 01:03 Uhr

Mitglied: bastla
bastla 07.02.2007 um 15:13:10 Uhr
Goto Top
Hallo wickie666!

So vielleicht:
@echo off & setlocal EnableDelayedExpansion
set line=
FOR /f "delims=" %%f IN ('type "MODULES.txt"') DO set "line=!line! %%f"  
echo %line%>>sortiert.txt
Mit dem "type" habe ich etwas Zusatzaufwand betrieben, um zB Pfadangaben mit Leerstellen unterbringen zu können - kannst Du auch wieder auf die Angabe des Dateinamens (aber ohne Anführungszeichen) reduzieren.

Grüße
bastla
Mitglied: wickie666
wickie666 07.02.2007 um 15:33:06 Uhr
Goto Top
super, das funktioniert.
Nun aber noch eine kleine frage, da ich nicht genau weiss, wie ich es angehen soll:
Wie kann ich nun jeweils nach 3 einträgen einen Zeilenumbruch erstellen?
in batch dateien kann man for schleifen doch nicht verschachteln, oder?
Mitglied: bastla
bastla 07.02.2007 um 15:55:56 Uhr
Goto Top
Hallo wickie666!

Verschachteln ginge schon, Du könntest es aber auch so versuchen:
@echo off
set line=
set /a count=0
FOR /f "delims=" %%f IN ('type "MODULES.txt"') DO call :ProcessLine "%%f"  
(echo %line%)>>sortiert.txt
goto :eof
:ProcessLine
if %count%==0 goto :NewLine
set /a count+=1
If %count% GTR 3 goto :NewLine
set "line=%line% %~1"  
goto :eof
:NewLine
If %count% neq 0 (echo %line%)>>sortiert.txt
set "line=%~1"  
set /a count=1
goto :eof
Die Klimmzüge mit dem Überprüfen von %count% auf 0 verhindern, dass vor der ersten Zeile eine Leerstelle ausgegeben wird und die Klammern verhindern das am Ende der Zeile.

Grüße
bastla
Mitglied: Biber
Biber 07.02.2007 um 16:55:03 Uhr
Goto Top
Moin wickie666,

hmmm... ein bisschen angestrengt sehen diese Klimmzüge schon aus.

Eine Variation von bastla's Vorlage wäre:
::----------snipp 3Lines2One.bat
@echo off &setlocal
set line=
set /a count=0
FOR /f "delims=" %%f IN ('type "MODULES.txt"') DO call :ProcessLine "%%f"  
if [%line%] NEQ  (echo %line%)>>sortiert.txt
goto :eof

:ProcessLine
set "line=%line% %~1"  
set /a count+=1
set /a modrest=count%%3
If %modrest%==0 (
    (echo %line%)>>sortiert.txt
    set Line=
)   
goto :eof
::----------snipp 3Lines2One.bat

Ich hab dieses "Plus 1 und wenn = 3 dann wieder 0" jetzt mit der Modulo-Funktion versucht, etwas lesbarer zu machen.
Und, zweite Anmerkung, ich würde diese Umleitung nach sortiert.txt NICHT im Batch nach den ECHO-Befehlen machen, sondern im Batch nur ein "Echo %line%" behalten.
Und dann den Batch 3Lines2One.bat ggf. komplett umleiten.
3Lines2One >sortiert.txt

Gruss
Biber
Mitglied: bastla
bastla 07.02.2007 um 17:33:01 Uhr
Goto Top
@Biber

Kommt mir das nur so vor, oder beginnen bei Deiner Lösung alle Ergebniszeilen mit einer Leerstelle (das zu vermeiden war eigentlich der Grund der kaum gewürdigten Anstrengung face-wink?

Grüße
bastla
Mitglied: Biber
Biber 07.02.2007 um 18:06:06 Uhr
Goto Top
@bastla

Menno, man/frau kann sich auch anstellen... ist doch nur ein Batch.. face-wink
::----------snipp 3Lines2One.bat
@echo off &setlocal
set "line= "  
set /a count=0
FOR /f "delims=" %%f IN ('type "MODULES.txt"') DO call :ProcessLine "%%f"  
if "%line%" NEQ " " (echo %line%x)  
goto :eof

:ProcessLine
set "line=%line%%~1"  
set /a count+=1
set /a modrest=count%%3
If %modrest%==0 (
    (echo %line%)
    set "Line= "  
)   
goto :eof
::----------snipp 3Lines2One.bat

[wirkt immer noch nicht angestrengt,,,,]

Grüße
Biber
Mitglied: bastla
bastla 07.02.2007 um 18:42:16 Uhr
Goto Top
@Biber

Montag? Dann sag' ich jetzt nix mehr ...

Grüße
bastla
Mitglied: Biber
Biber 07.02.2007 um 18:49:20 Uhr
Goto Top
...seit ich diesen ###-Job hier in diesem ver###ten ###snest habe, ist jeder Tag ein gefühlter Montag...

Das kannst Du auch nicht schlimmer werden lassen... face-big-smile
Mitglied: bastla
bastla 07.02.2007 um 18:55:33 Uhr
Goto Top
@Biber
Das kannst Du auch nicht schlimmer werden lassen...
Soll keiner sagen, ich hätt's nicht versucht. face-wink

Sorry - bin momentan etwas hyperaktiv (Fieber hat nachgelassen, Lungenentzündung als "nur leicht" diagnostiziert) ...

Zonenrandgebiet
Noch länger?

Grüße
bastla