josken69
Goto Top

Text einlesen, umwandeln und in einer Zeile wieder ausgeben

Hallo

Hallo,
ich möchte eine txt-Datei zeilenweise auslesen, auf eine Zeichenlänge von 128 Zeichen mit Blanksauffülen und dann in einer anderen Datei ohne CRLF als eine Zeile wieder ausgeben.
Die Umwandlung ist erledigt, aber wenn ich das normal mit echo in die neue Datei schreibe, wird ja hinter jede Zeile eine Zeilenschaltung gesetzt. So versuche ich den ganzen Kram erst in einer Variable zu sammlen und erst ganz am Schluss in die Datei zu schreiben. Aber es funktioniert nicht, weil wohl die Ausgabe in die Gesamtzeilen-Varibale bei jedem Durchlauf ausgeführt wird und die Zeiel so zu lang wird. Wie bekomme ich die Batch dazu erst nach der Ausführung der For-Schleife das echo in die Datei auszuführen?
Vielen Dank
 
@echo off & setlocal
set /p File=Geben Sie bitte den Pfad und die Datei an, die umgeandelt werden soll z.B. c:\pfad\test 
Set "NewFile=c:\Alone\newfile.txt"  
if exist "%NewFile%" del "%NewFile%"  
set "Bak=%File%.bak"  
copy "%File%" "%Bak%"  
Set "lineout=  
set "Blanks100=                                                                                                    "  
for /f "usebackq delims=" %%i in ("%File%") do set "zeile=%%i%Blanks100%" & call :ProcessLine  
Goto :eof

:ProcessLine
Set "zeile=%zeile:&=§%"  
set "zeile=%zeile:~0,128%  
Set "zeile=%zeile:§=^&%"  
Set "lineout=%lineout%%zeile%  
goto :eof

:Ende
>>"%NewFile%" (Echo %lineOut%)  

Content-ID: 129772

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

Ausgedruckt am: 16.11.2024 um 22:11 Uhr

bastla
bastla 19.11.2009 um 16:18:31 Uhr
Goto Top
Hallo josken69!

Unter Verwendung eines "Biber-Special" könnte das Unterprogramm ":ProcessLine" so aussehen:
:ProcessLine
Set "zeile=%zeile:&=§%"  
set "zeile=%zeile:~0,128%  
Set "zeile=%zeile:§=^&%"  
<nul >>"%NewFile%" set /p "dummy=%zeile%"  
goto :eof
Ansonsten wäre in Deinem Ansatz als Zeile 11 ein
goto :Ende
zu empfehlen.

Grüße
bastla
Dominikdak
Dominikdak 22.11.2009 um 20:09:04 Uhr
Goto Top
Zitat von @bastla:
Unter Verwendung eines "Biber-Special" könnte das
Unterprogramm ":ProcessLine" so aussehen:
:ProcessLine
> Set "zeile=%zeile:&=§%"  
> set "zeile=%zeile:~0,128%  
> Set "zeile=%zeile:§=^&%"  
> <nul >>"%NewFile%" set /p  
> "dummy=%zeile%"  
> goto :eof


Hi, ich bin Anfänger im kryptischen Batchgebiet, könntest du mir erklären, was zeile:&=§, zeile:~0,128 und zeile:§=^& bedeuten?
Und was <nul> eigentlich ist?
bastla
bastla 22.11.2009 um 22:15:52 Uhr
Goto Top
Hallo Dominikdak und willkommen im Forum!

Vorweg: Hilfe zu CMD-Befehlen bekommst Du grundsätzlich durch Aufruf des Befehles mit dem Parameter "/?" - im konkreten Fall also etwa:
set /?
Die ersten drei Zeilen des Unterprogramms haben folgenden Sinn:
  • (Temporäres) Ersetzen von in der Zeile vorkommenden "&" durch "§" (oder ein - beinahe - beliebiges anderes Zeichen, das nicht in der Zeile vorkommt)
  • Kürzen der Zeile auf 128 Zeichen
  • Zurückverwandeln der "§" in "&", wobei letztere "maskiert" werden - ein vorangestelltes "^" sorgt dafür, dass das darauf folgende Zeichen nicht "interpretiert", sondern als gewöhliches Zeichen betrachtet (und daher zB einfach ausgegeben wird). Nötig ist diese Vorgangsweise speziell bei den Zeichen "&", "<", "|" und ">", da diese besondere Bedeutung haben - mit "&" werden zB zwei Befehle verknüpft, was ohne Maskierung dazu führen würde, dass etwa ein
echo Dies & das
als Folge der Befehle
echo Dies
sowie
das
verstanden würde, was natürlich definitiv nicht zum gewünschten Ergebnis führt face-wink, während
echo Dies ^& das
die vorgesehen Ausgabe erzeugt.
"nul" steht zwar für "Nix", ist aber technisch gesehen ein "Gerät" und kann daher für Ein- bzw Ausgaben verwendet werden - typisches Beispiel:
copy Datei1.txt Datei2.txt >nul
Hier wird eine Datei kopiert, wobei die CMD-Shell den Erfolg stolz mit der Ausgabe von
        1 Datei(en) kopiert.
dokumentiert. Da aber dieser Ausgabe oft unerwünscht ist, wird sie zum Gerät "nul" geschickt (der Vorgang wird "Umleitung" genannt und für Ausgaben durch ">" veranlasst) und verschwindet damit auf Nimmerwiedersehen.

Im Code oben wird "nul" als Eingabegerät verwendet (daher mit "<"), um eine Eingabe als Abschluss des "set /p"-Befehles zu simulieren und damit den Trick "Schreibe in eine Datei ohne abschließende Zeilenschaltung" zu ermöglichen. Wie das funktioniert ist relativ leicht zu erkennen, wenn Du etwa
set /p "Eingabe=Bitte eine Zahl eingeben!"
an der Kommandozeile versuchst - nach dem Text "Bitte eine Zahl eingeben!" wird weder ein Leerzeichen noch eine Zeilenschaltung eingefügt, allerdings wird eine Eingabe erwartet (deshalb im konkreten Fall oben die Simulation unter Verwendung des "nul"-Devices).

In einer Batchdatei könntest Du das zB so nutzen:
@echo off & setlocal
<nul set /p "Eingabe=Teil 1 des Textes "
<nul set /p "Eingabe=und Teil 2 des Textes "
<nul set /p "Eingabe=stehen in der selben Zeile!"
Grüße
bastla
Dominikdak
Dominikdak 22.11.2009 um 23:29:09 Uhr
Goto Top
Wow danke!!
Wenn du mir jetzt noch sagst, was setlocal ist, bin ich gerüstet!

face-smile
bastla
bastla 22.11.2009 um 23:42:06 Uhr
Goto Top
Hallo Dominikdak!
setlocal /?

Hauptsächlicher Zweck: In diesem Batch erstellte / veränderte Werte von Variablen gelten nur während der Batch läuft, danach nicht mehr - Beispiel:
An der Kommandozeile:
set "Var=Test"
Im Batch:
@echo off & setlocal
echo %Var%
set "Var=Anders"  
echo %Var%
Wieder an der Kommandozeile:
echo %Var%
Zweck der Aktion: Es bleiben keine "Reste" vorher gelaufener Batches im Speicher; diese können daher auch nicht zu falschen Ergebnissen eines später gestarteten Batches führen ...

Grüße
bastla

P.S.: Wofür gerüstet?
josken69
josken69 23.11.2009 um 09:44:38 Uhr
Goto Top
Hallo bastla,
vielen Dank für die Antwort. Also das mit dem goto : Ende in Zeile 11 bringts bei mir irgendwie nicht. Kommt dann der Fehler Zeile zu lang.
Die Variante "Biber-Special" funktioniert da schon weit besser. Hier gibt's lediglich den Fehler, dass in der Ausgabedatei dann ein ^ vor meine &-Zeichen steht. Weisst Du, warum und wie ich das noch ausmerzen kann?
Vielen Dank & Gruß Josh
bastla
bastla 23.11.2009 um 11:56:20 Uhr
Goto Top
Hallo josken69!

Das Ersetzen der "&" durch "^&" und die Ausgabe unter Anführungszeichen war dann doch zuviel des Guten - daher in Zeile 5 nur
<nul >>"%NewFile%" set /p dummy=%zeile%
(aber darauf achten, dass sich nicht am Ende noch ein Leerzeichen "einschleicht").

Grüße
bastla
josken69
josken69 23.11.2009 um 14:43:31 Uhr
Goto Top
Hallo bastla,
yep, das war's. Vielen Dank für die Unterstützung.