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
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%)
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 129772
Url: https://administrator.de/contentid/129772
Ausgedruckt am: 16.11.2024 um 22:11 Uhr
8 Kommentare
Neuester Kommentar
Hallo josken69!
Unter Verwendung eines "Biber-Special" könnte das Unterprogramm ":ProcessLine" so aussehen:
Ansonsten wäre in Deinem Ansatz als Zeile 11 ein
zu empfehlen.
Grüße
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
goto :Ende
Grüße
bastla
Zitat von @bastla:
Unter Verwendung eines "Biber-Special" könnte das
Unterprogramm ":ProcessLine" so aussehen:
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?
Hallo Dominikdak und willkommen im Forum!
Vorweg: Hilfe zu CMD-Befehlen bekommst Du grundsätzlich durch Aufruf des Befehles mit dem Parameter "
Die ersten drei Zeilen des Unterprogramms haben folgenden Sinn:
als Folge der Befehle
sowie
verstanden würde, was natürlich definitiv nicht zum gewünschten Ergebnis führt , während
die vorgesehen Ausgabe erzeugt.
"
Hier wird eine Datei kopiert, wobei die CMD-Shell den Erfolg stolz mit der Ausgabe von
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 "
Im Code oben wird "
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 "
In einer Batchdatei könntest Du das zB so nutzen:
Grüße
bastla
Vorweg: Hilfe zu CMD-Befehlen bekommst Du grundsätzlich durch Aufruf des Befehles mit dem Parameter "
/?
" - im konkreten Fall also etwa:set /?
- (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
echo Dies
das
echo Dies ^& das
"
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
1 Datei(en) kopiert.
>
" 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 etwaset /p "Eingabe=Bitte eine Zahl eingeben!"
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!"
bastla
Hallo Dominikdak!
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:
Im Batch:
Wieder an der Kommandozeile:
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?
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"
@echo off & setlocal
echo %Var%
set "Var=Anders"
echo %Var%
echo %Var%
Grüße
bastla
P.S.: Wofür gerüstet?