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, 5605 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 ..
Ähnliche Inhalte
C und C++
String einlesen in Array und wieder ausgeben von hinten (4)

Frage von Protected zum Thema C und C ...

Batch & Shell
Batsch doppelte Zeile in in Text finden und eine löschen (10)

Frage von GNLen1 zum Thema Batch & Shell ...

Windows 7
Texte weisen Fehler auf letzte Zeile wie Barcod Striche (3)

Frage von Nemonautilus zum Thema Windows 7 ...

Neue Wissensbeiträge
Windows Server

Umstellung SHA 1 auf SHA 2 - Migration der CA von CSP auf KSP

Tipp von Badger zum Thema Windows Server ...

Windows 10

Quato DTP94 unter Windows 10 x64 installieren und verwenden

Anleitung von anteNope zum Thema Windows 10 ...

Windows 10

Win10 1703 und Nutzerkennwörter bei Ersteinrichtung - erstaunliche Erkenntnis

(15)

Erfahrungsbericht von DerWoWusste zum Thema Windows 10 ...

Heiß diskutierte Inhalte
Server-Hardware
HP DL380 G7: Booten vom USB via USB 3.1-PCI-e Karte möglich? (24)

Frage von Paderman zum Thema Server-Hardware ...

Windows 7
Bluesreens unternehmensweit (19)

Frage von SYS64738 zum Thema Windows 7 ...

LAN, WAN, Wireless
IP Adressen - Modem - Switch - Accesspoint (17)

Frage von teuferl82 zum Thema LAN, WAN, Wireless ...

Windows Netzwerk
DNS ins mehreren Subnetzen (13)

Frage von joerg zum Thema Windows Netzwerk ...