Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

Text einlesen, umwandeln und in einer Zeile wieder ausgeben

Frage Entwicklung Batch & Shell

Mitglied: josken69

josken69 (Level 1) - Jetzt verbinden

19.11.2009 um 14:00 Uhr, 5586 Aufrufe, 8 Kommentare

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
01.
  
02.
@echo off & setlocal 
03.
set /p File=Geben Sie bitte den Pfad und die Datei an, die umgeandelt werden soll z.B. c:\pfad\test  
04.
Set "NewFile=c:\Alone\newfile.txt" 
05.
if exist "%NewFile%" del "%NewFile%" 
06.
set "Bak=%File%.bak" 
07.
copy "%File%" "%Bak%" 
08.
Set "lineout= 
09.
set "Blanks100=                                                                                                    " 
10.
for /f "usebackq delims=" %%i in ("%File%") do set "zeile=%%i%Blanks100%" & call :ProcessLine 
11.
Goto :eof 
12.
 
13.
:ProcessLine 
14.
Set "zeile=%zeile:&=§%" 
15.
set "zeile=%zeile:~0,128% 
16.
Set "zeile=%zeile:§=^&%" 
17.
Set "lineout=%lineout%%zeile% 
18.
goto :eof 
19.
 
20.
:Ende 
21.
>>"%NewFile%" (Echo %lineOut%)
Mitglied: bastla
19.11.2009 um 16:18 Uhr
Hallo josken69!

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

Grüße
bastla
Bitte warten ..
Mitglied: Dominikdak
22.11.2009 um 20:09 Uhr
Zitat von bastla:
Unter Verwendung eines "Biber-Special" könnte das
Unterprogramm ":ProcessLine" so aussehen:
01.
:ProcessLine 
02.
> Set "zeile=%zeile:&=§%" 
03.
> set "zeile=%zeile:~0,128% 
04.
> Set "zeile=%zeile:§=^&%" 
05.
> <nul >>"%NewFile%" set /p 
06.
> "dummy=%zeile%" 
07.
> 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?
Bitte warten ..
Mitglied: bastla
22.11.2009 um 22:15 Uhr
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 , 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
Bitte warten ..
Mitglied: Dominikdak
22.11.2009 um 23:29 Uhr
Wow danke!!
Wenn du mir jetzt noch sagst, was setlocal ist, bin ich gerüstet!

Bitte warten ..
Mitglied: bastla
22.11.2009 um 23:42 Uhr
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:
01.
@echo off & setlocal 
02.
echo %Var% 
03.
set "Var=Anders" 
04.
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?
Bitte warten ..
Mitglied: josken69
23.11.2009 um 09:44 Uhr
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
Bitte warten ..
Mitglied: bastla
23.11.2009 um 11:56 Uhr
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
Bitte warten ..
Mitglied: josken69
23.11.2009 um 14:43 Uhr
Hallo bastla,
yep, das war's. Vielen Dank für die Unterstützung.
Bitte warten ..
Neuester Wissensbeitrag
CPU, RAM, Mainboards

Angetestet: PC Engines APU 3a2 im Rack-Gehäuse

(1)

Erfahrungsbericht von ashnod zum Thema CPU, RAM, Mainboards ...

Heiß diskutierte Inhalte
Switche und Hubs
Trunk für 2xCisco Switch. Wo liegt der Fehler? (13)

Frage von JayyyH zum Thema Switche und Hubs ...

DSL, VDSL
DSL-Signal bewerten (13)

Frage von SarekHL zum Thema DSL, VDSL ...

Windows Server
Mailserver auf Windows Server 2012 (9)

Frage von StefanT81 zum Thema Windows Server ...