spidi-25
Goto Top

TXT einlesen bearbeiten und in eine scr speichern

Hallo alle zusammen,

ich bräuchte wieder mal eure Hilfe.

Hier mein Problem

ich versuche folgenden txt Dateiinhalt einzulesen und in *.Scr (Script Datei) abzuspeichern

hier der txt inhalt

testzeile 1
testzeile 2
testzeile 3
testzeile 4
testzeile 5
testzeile 6


testzeile 9
testzeile 10
testzeile 11

testzeile 13

hier mein Code

@echo off & setlocal enableDelayedExpansion

for /f "tokens=1,* delims=:" %%i in ('findstr /n   $ V:\cmd\Test.txt') do (   
        for /L %%a in (3,1,80) do if %%i==%%a set neu=%%~j & echo !neu:Testzeile 6=Variable_Zeile!>>S1.scr
)

und folgendes wird in die *.Scr Datei geschrieben

testzeile 3 
testzeile 4 
testzeile 5 
Variable_Zeile 
ECHO ist ausgeschaltet (OFF).
ECHO ist ausgeschaltet (OFF).
testzeile 9 
testzeile 10 
testzeile 11 
ECHO ist ausgeschaltet (OFF).

es passt so weit alle, bis auf die "ECHO ist ausgeschaltet (OFF).", hier sollten die Zeile leer wie bei der TXT sein!

THX

Grüße
Spidi-25

Content-ID: 155999

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

Ausgedruckt am: 22.11.2024 um 17:11 Uhr

Biber
Biber 29.11.2010 um 22:14:33 Uhr
Goto Top
Moin Spidi-25,

wenn das, was der Echo-Befehl ausgeben soll, auch "leer" oder "nichts" sein kann, dann geht das mit einem Punkt/einem Schrägstrich und ca 10 anderen Zeichen DIREKT nach dem Wort ECHO.

Beispiele
ECHO.
ECHO\
ECHO,
ECHO;
echo]

Etc.
GGF vorher am CMD-Prompt verdeutlichen. Keins der genannten Zeichen wird angezeigt, wenn der Rest NICHT leer ist.

Beispiel
>echo[hallo
hallo

Grüße
Biber
Friemler
Friemler 29.11.2010 um 22:16:03 Uhr
Goto Top
Hallo Spidi-25,

versuch's mal mit
@echo off & setlocal enableDelayedExpansion

for /f "tokens=1,* delims=:" %%i in ('findstr /n $ Test.txt') do (  
  for /L %%a in (3,1,80) do if %%i==%%a set neu=%%~j & echo=!neu:Testzeile 6=Variable_Zeile!>>S1.scr
)
exit /b
Statt nach dem ECHO-Befehl ein Leerzeichen zu schreiben, nimm ein Gleichheitszeichen. ECHO= erzeugt einen Zeilenumbruch (genauso wie z.B. ECHO. oder ECHO\ oder ECHO:, die hier vermutlich wegen der verzögerten Variablenerweiterung nicht funktionieren). ECHO( würde auch gehen.

Gruß
Friemler
Spidi-25
Spidi-25 29.11.2010 um 23:02:58 Uhr
Goto Top
Hallo Biber, Hallo Friemler

Danke für die Tipps


das mit dem . und mit dem \ habe ich schon probiert gehabt, dann hatte ich bei jeder Zeile am Anfang ein Leerzeichen das soll nicht sein.

Mit dem ; , und = sind die echos weg und die Leerzeichen am Anfang jeder Zeile sind auch weg. Aber die Zeile 05,06 und 10 enthalten ein Leerzeichen, das soll aber nur ein Zeilenumbruch sein ohne einen (Leerzeichen) String zu enthalten!

gibt es noch Möglichkeiten?

Gruß
Spidi-25
bastla
bastla 29.11.2010 um 23:22:19 Uhr
Goto Top
Hallo Spidi-25!

Etwa so:
@echo off & setlocal enableDelayedExpansion
for /f "tokens=1* delims=:" %%i in ('findstr /n $ Test.txt') do (  
    for /L %%a in (3,1,80) do if %%i==%%a (
        set "neu=%%~j"  
        if defined neu (echo !neu:Testzeile 6=Variable_Zeile!) else (echo\)
    )
)>>S1.scr
Grüße
bastla
Spidi-25
Spidi-25 29.11.2010 um 23:35:34 Uhr
Goto Top
Hallo Bastla

danke für den Code, aber damit bekomme ich die gleiche Ausgabe wie oben mit den ECHO ist ausgeschaltet (OFF). in den Zeilen 05,06 und 10


Gruß
Spidi-25
bastla
bastla 29.11.2010 um 23:40:21 Uhr
Goto Top
Hallo Spidi-25!

Sorry - kann ich nicht nachvollziehen; mit den von Dir geposteten Testdaten und meinem Batchansatz sieht das Ergebnis bei mir so aus:
testzeile 3
testzeile 4
testzeile 5
Variable_Zeile


testzeile 9
testzeile 10
testzeile 11
Es würde sich übrigens als (Batch-) Zeile 2 noch
del S1.scr 2>nul
anbieten - und mit
for /f "tokens=1* delims=:" %%i in ('findstr /n "^" Test.txt') do (
wird auch die letzte Zeile (die nicht mit einer Zeilenschaltung endet) erfasst.

Grüße
bastla
Spidi-25
Spidi-25 30.11.2010 um 07:07:24 Uhr
Goto Top
Hallo Bastla,

Das hätte ich von Anfang an erwähnen müssen, mein Fehler.

dein code funktioniert so weit gut, wen die txt Datei in der Zeile 7,8 und 12 kein Lehrzeichen enthalten, sie enthält aber teilweise. Könnte man das so machen, egal ob die txt Lehrzeichen in den Zeilen z.B. 7,8 und 12 oder nur Zeilenumbruche hat nach der Ausgabe in .scr die Zeilen 5,6 und 10 keine Lehrzeichen mehr enthält!


Grüße
Spidi-25
bastla
bastla 30.11.2010 um 09:09:26 Uhr
Goto Top
Hallo Spidi-25!

Eine Möglichkeit:
@echo off & setlocal enableDelayedExpansion
del S1.scr 2>nul
for /f "tokens=1* delims=:" %%i in ('findstr /n "^" Test.txt') do (  
    for /L %%a in (3,1,80) do if %%i==%%a (
        set "neu=%%~j"  
        if not defined neu (
            echo\
        ) else (
            set "Leer=true"  
            for /f %%t in ("!neu!") do set "Leer="  
            if defined Leer (echo\) else (echo !neu:Testzeile 6=Variable_Zeile!)
        )
    )
)>>S1.scr
Grüße
bastla
Spidi-25
Spidi-25 30.11.2010 um 12:39:49 Uhr
Goto Top
Hallo Bastla

Fast perfekt nur noch folgendes Problem

angenommen Inhalt meiner TXT Zeile 7 enthält ein Lehrzeichen und Zeile 8 kein Lehrzeichen, nach der Ausgabe in .scr habe ich in Zeile 5 Kein Lehrzeichen und in der Zeile 6 ein Lehrzeichen, sollten aber in 5 und 6 Keine Lehrzeichen enthalten sein.

Bekommen wir das noch irgend wie hin?

P.S. was bedeutet
set "Leer=true"  (true)  


Gruß
Spidi-25
bastla
bastla 30.11.2010 um 13:51:02 Uhr
Goto Top
Hallo Spidi-25!

Auch das sieht bei mit anders aus: Für
testzeile 1
testzeile 2
testzeile 3
testzeile 4
testzeile 5
testzeile 6
 

testzeile 9
testzeile 10
testzeile 11

testzeile 13
erhalte ich mit der letzten Batch-Version als Ergebnis
testzeile 3
testzeile 4
testzeile 5
Variable_Zeile


testzeile 9
testzeile 10
testzeile 11

testzeile 13
Mit
set "Leer=true"
weise ich der Variablen %Leer% (bzw hier eigentlich !Leer!) einen beliebigen Wert zu (muss also nicht "True" sein), um diese Variable als "Schalter" zu verwenden. Wenn die Zeile nicht leer ist (und daher der "do"-Teil der Schleife in Zeile 10 ausgeführt wird), wird dieser Wert gelöscht, woraufhin die Variable tatsächlich "leer" ist (also keinen Inhalt mehr hat), was sich per "if defined" abfragen lässt ...

Grüße
bastla

P.S.: Falls es Dich nicht allzuviel Überwindung kostet face-wink: Ich würde die Schreibweise "Leerzeichen" bevorzugen ...
Biber
Biber 30.11.2010 um 15:14:46 Uhr
Goto Top
[OT]
Moin bastla,

Zitat von @bastla:
P.S.: Falls es Dich nicht allzuviel Überwindung kostet face-wink: Ich würde die Schreibweise "Leerzeichen" bevorzugen ...

Hab ich schon gestern mühsam zurückgehalten, die Anmerkung "Das is' ja wieder ein Beitrag wie aus dem Leerbuch..."

Grüße
Biber
[/OT]
Spidi-25
Spidi-25 30.11.2010 um 15:29:55 Uhr
Goto Top
Perfekt Danke Bastla

Habe irgend was beim Kopieren vom Code ausgelassen, Habe es erneut kopiert und sieh da es geht! Vielen Dank

Gruß
Spidi-25
jeb-the-batcher
jeb-the-batcher 30.11.2010 um 23:12:22 Uhr
Goto Top
Hallo zusammen,

noch ein paar Anmerkungen zum "sicheren" echo .

Bei dem echo= und echo: Varianten klappen zwar die Leerzeilen, dafür ist echo= aber anfällig für /?, es zeigt die echo-Hilfe an, statt /?
Ein echo\ oder echo: ist anfällig gegen \..\%~0 es startet die eigene Batchdatei.
echo., echo] oder echo[ klappt nicht sobald eine Datei Namens echo[, echo] oder echo. existiert.

echo( sollte immer funktionieren (ich hab vielleicht aber nur noch nicht den Fall gefunden, bei dem es fehlschlägt)

Hoffe es hilft
jeb
Spidi-25
Spidi-25 30.11.2010 um 23:25:26 Uhr
Goto Top
Hallo Leute

wie bekomme ich eine weitere Variable Bearbeitung z.B. in txt für testzeile 10 in der .scr als Ausgabe "Variable_Zeile2", habe mich mit else bis jetzt noch nicht beschäftigt!

Gruß
Spidi-25
bastla
bastla 01.12.2010 um 16:20:01 Uhr
Goto Top
Hallo Spidi-25!

Leider verstehe ich nicht genau, was Du erreichen willst - falls es eine Ersetzung für "Testzeile 10" nach dem Vorbild von "Testzeile 6" sein sollte, dann etwa so:
if defined Leer (
    echo\
) else (
    set "neu=!neu:Testzeile 6=Variable_Zeile!"  
    set "neu=!neu:Testzeile 10=Variable_Zeile2!"  
    echo !neu!
)
als Ersatz der Zeile 11 ...

Grüße
bastla
Spidi-25
Spidi-25 01.12.2010 um 16:47:05 Uhr
Goto Top
Danke Bastla, genau das habe ich gesucht Perfekt!!!!!!!!

Gruß
Spidi-25
pieh-ejdsch
pieh-ejdsch 19.12.2010 um 17:05:22 Uhr
Goto Top
moin,

nach zeile 05. set "neu=%%~j"
geht auch
		for /f "tokens=*" %%k in ("%%j") do if "%%k" == "" (@echo.) else (  
			set "neu=!neu:Testzeile 6=Variable_Zeile!"  
			set "neu=!neu:Testzeile 10=Variable_Zeile2!"  
			echo !neu!
)	)	)>>S1.scr

Gruß Phil
Spidi-25
Spidi-25 19.12.2010 um 20:08:17 Uhr
Goto Top
Danke Phil, für den Tipp

beim einlesen von folgendem txt Inhalt


testzeile 1
testzeile 2
testzeile 3
testzeile 4
testzeile 5
testzeile 6
 

testzeile 9
testzeile 10
testzeile 11

testzeile 13 

wir mit deinem Code die Zeile 7 verschlungen

Grüße
Spidi-25
bastla
bastla 19.12.2010 um 20:53:56 Uhr
Goto Top
@ph
Sollte eigentlich nicht funktionieren, da bei einer Leerzeile der "do"-Teil gar nicht ausgeführt wird (deswegen ja auch die Workarounds mit "findstr /n" etc) ...

Grüße
bastla
pieh-ejdsch
pieh-ejdsch 19.12.2010 um 21:30:24 Uhr
Goto Top
upps, hab ich garnet bedacht. Ich hatte keine komplette Lerzeile im Test in der Datei - nur Tab und Leerzeichen.

da muss nur noch ein Leerzeichen in die erste For-Schleife vor dem %%j

		for /f "tokens=*" %%k in (" %%j") do if "%%k" == "" (@echo.) else (

dann sollte es klappen

Gruß Phil
bastla
bastla 19.12.2010 um 21:38:44 Uhr
Goto Top
... aber nur, wenn Du dann auch auf das Leerzeichen abfragst
		for /f "tokens=*" %%k in (" %%j") do if "%%k" == " " (@echo.) else (
Grüße
bastla

[Edit] Kommentar hinfällig - Leerzeichen kann natürlich (wegen der Verwendung der Default-Delimiter = Leerzeichen und TAB) nicht mehr da sein [/Edit]
pieh-ejdsch
pieh-ejdsch 19.12.2010 um 21:52:28 Uhr
Goto Top
... nö
gibt doch keins mehr in der ausgabe.
sonst wäre doch Zeile 8 und Zeile 12 auch nicht gekommen

hier ist was für die CMD-Line
for /f "tokens=*" %i in ("") do echo %i  
for /f "tokens=*" %i in (" ") do echo %i  

es kommt also drauf an ob die Forschleife im Satz etwas zu verwerten hat. - dann wird auch nach dem DO etwas ausgeführt
eine Leere Zeile ist eben nichts zum Verwerten - also nothing to DO

Du bist doch aber der BatchKing - schau mal in die NumberMe
Gruß Phil
Spidi-25
Spidi-25 19.12.2010 um 21:53:14 Uhr
Goto Top
hallo bastla

funktioniert aber genau richtig ohne Leerzeichen wie von Phil gepostet

for /f "tokens=*" %%k in (" %%j") do if "%%k" == "" (@echo.) else (  

Grüße
Spidi-25
bastla
bastla 19.12.2010 um 22:00:20 Uhr
Goto Top
Hallo Spidi-25 und PH!

Stimmt: das Leerzeichen ist kontraproduktiv - sorry, dass ich das Testen Euch überlassen habe face-sad ...

(Die Fehleinschätzung kam übrigens daher, dass ich in derartigen Fällen eigentlich immer anstelle von "tokens=*" die Schreibweise "delims=" verwende.)

Grüße
bastla