Top-Themen

Aktuelle Themen (A bis Z)

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

Textdatei mit Sonderzeichen Zeilenweise auslesen, Zeilen bearbeiten und in neue Textdatei schreiben

Frage Entwicklung Batch & Shell

Mitglied: FomerMay

FomerMay (Level 1) - Jetzt verbinden

28.12.2011, aktualisiert 18.10.2012, 3867 Aufrufe, 6 Kommentare

Hallo,

folgendes Problem ich habe eine Textdatei mit einer beliebigen Anzahl an Zeilen, die alle eine unterschiedliche Länge haben. Ich will jede Zeile auslesen, die Anzahl der Zeichen ermitteln, die Zeile mit Leerzeichen auffüllen und danach die Zeile in eine neue Textdatei schreiben. Das bekomme ich prinzinpiell hin, sobald aber ein Sonderzeichen (&) in der Zeile vorhanden ist wird diese übersprungen.
01.
@ECHO OFF & setlocal enabledelayedexpansion 
02.
 
03.
:START 
04.
SET /A num=0 
05.
SET pfad=C:\ 
06.
 
07.
IF EXIST %pfad%Datei_neu.txt DEL %pfad%Datei_neu.txt 
08.
 
09.
REM Ermittlung der Gesamtanzahl an Zeilen 
10.
FOR /F "delims=:" %%A IN ('findstr /N .* "%pfad%Datei_alt.txt"') DO SET zeilenGesamt=%%A 
11.
 
12.
REM Schleife, die jede Zeile der Zieldatei öffent und an Sprungmarke :AUSLESEN übergibt 
13.
FOR /F "delims=" %%A IN (%pfad%Datei_alt.txt) DO CALL :auslesen "%%A" 
14.
REM Wenn alle Zeilen durchlaufen gehe zu Sprungmarke :EOF 
15.
GOTO :EOF 
16.
 
17.
REM Wird für jede Zeile der Zieldatei aufgerufen, gibt die Zeilennummer an, weisst 
18.
REM die Zeile einer fortlaufenden Variable zu und übergibt diese an die Sprungmarke 
19.
REM strLaeng 
20.
:auslesen 
21.
SET /A num=%num%+1 
22.
ECHO Zeile %num% von %zeilenGesamt% Zeilen 
23.
SET var%num%="%~1" 
24.
GOTO :strLaeng %var%num%% 
25.
 
26.
REM Bestimmen der Anzahl Zeichen pro Zeile 
27.
:strLaeng 
28.
SET WorkString=%* 
29.
SET strLength=0 
30.
REM Es wird jedes Zeichen einer Zeile durchgegangen bis kein Zeichen mehr vorhanden ist, 
31.
REM beim jedem Durchlauf wird die Varibale strLength eins hochgezählt. 
32.
:strLaeBe 
33.
IF NOT "!WorkString:~%strLength%,1!"=="" ( 
34.
  SET /A strLength += 1 
35.
  GOTO :strLaeBe 
36.
37.
REM Die Variable der neuen Zeile wird erzeugt. 
38.
SET neueZeile=%* 
39.
SET neueZeile=%neueZeile:~1,-1% 
40.
REM Es wird die Anzahl der Zeichen ermittelt welche an den neuen String angehängt werden müssen. 
41.
SET /A strNeu=1555-%strLength% 
42.
SET strSpace=  
43.
REM Für die Anzahl der fehlenden Zeichen wird die Sprungmarke :Leerstel aufgerufen 
44.
FOR /L %%a IN (1,1,%strNeu%) DO CALL :leerstel 
45.
SET neueZeile3=%neueZeile:~0,1555% 
46.
ECHO %neueZeile%>>%pfad%Datei_neu.txt 
47.
 
48.
GOTO :EOF 
49.
 
50.
REM Der neuen Zeile wird bei jedem Durchlauf ein Leerzeichen angefügt. 
51.
:leerstel 
52.
SET neueZeile=%neueZeile%%strSpace% 
53.
 
54.
GOTO :EOF
Mit diesem Code wurden auch die Zeilen mit Sonderzeichen übernommen, mein Problem liegt jetzt darin das in dieser Zeile
01.
SET neueZeile=%neueZeile:~1,-1%
also beim entfernen der "" die Meldung bringt:
"Der Befehl "Mi" ist entweder falsch geschrieben oder konnte nicht gefunden werden."

"Mi" sind die Zeichenkette die hinter dem Sonderzeichen "&" kommen, und alle was hinter dem "&" wird nicht in die Neue Datei geschrieben. Lasse ich die Zeile weg werden natürlich nicht die Sonderzeichen entfernt, später kann ich sie nicht entfernen weil ich da ja schon die Leerzeichen hinten auffülle und das hintere Leerzeichen nicht mehr das letzte Zeichen ist.

ich hoffe ihr könnt mir helfen.
Mitglied: bastla
28.12.2011 um 21:05 Uhr
Hallo FomerMay und willkommen im Forum!

Abgesehen vom "Maskieren" der Sonderzeichen durch ein vorangestelltes "^" und einer auf die reine Ausgabe beschränkten Verwendung von "delayedexpansion" (wird auch im unten gezeigten Ansatz eingesetzt) für das Lösen des "Sonderzeichen-Problems" stellt sich die Frage, wozu die ganze Zeichenzählerei gut sein soll; wenn es nur darum ginge, alle Zeilen durch das Anfügen von Leerzeichen auf eine Länge von 1555 Zeichen zu bringen, würde ich einfach etwas in der Art verwenden:
01.
@ECHO OFF & setlocal 
02.
SET Pfad=C:\ 
03.
set "Ein=Datei_alt.txt" 
04.
set "Aus=Datei_neu.txt" 
05.
set /a Len=1555 
06.
 
07.
set "Spaces=" 
08.
setlocal enabledelayedexpansion 
09.
for /L %%i in (1,1,%Len%) do set "Spaces=!Spaces! " 
10.
endlocal & set "Spaces=%Spaces%" 
11.
 
12.
IF EXIST "%Pfad%%Aus%" DEL "%Pfad%%Aus%" 
13.
FOR /F "tokens=1* delims=:" %%a IN ('findstr /n "^" "%Pfad%%Ein%"') DO set "Zeile=%%b" & CALL :ausgeben 
14.
REM Wenn alle Zeilen durchlaufen sind, gehe zu Sprungmarke :EOF (= beende den Batch) 
15.
GOTO :EOF 
16.
 
17.
REM Wird für jede Zeile der Zieldatei aufgerufen und gibt die Zeile mit einer Gesamtlänge von 1555 Zeichen aus 
18.
:ausgeben 
19.
set "neueZeile=%Zeile%%Spaces%" 
20.
setlocal enabledelayedexpansion 
21.
>>"%Pfad%%Aus%" echo(!neueZeile:~,%Len%! 
22.
endlocal 
23.
GOTO :EOF
Es wird hier einfach vorweg ein String von 1555 Leerzeichen erzeugt, dann dieser an jede einzelne Zeile angefügt und jeweils die ersten 1555 Zeichen der so entstandenen neuen Zeile ausgegeben.

Soferne keine Leerzeilen zu berücksichtigen sind (wie es Dein oben stehender Code vermuten lässt), ließe sich die Zeile 13 auch auf
FOR /F "usebackq delims=" %%a IN ("%Pfad%%Ein%") DO set "Zeile=%%a" & CALL :ausgeben
reduzieren.

Grüße
bastla
Bitte warten ..
Mitglied: FomerMay
28.12.2011 um 21:45 Uhr
Das ist natürlich ein viel eleganterer Weg das Problem zu lösen, danke für die Hilfe bei meinen Code aber auch danke für den Denkanstoß!
Bitte warten ..
Mitglied: rubberman
28.12.2011 um 21:48 Uhr
Hallo Zusammen,

auch hier nochmal die etwas andere Lösung via SET /P

01.
@echo off &setlocal 
02.
set "Pfad=C:\" 
03.
set "Ein=Datei_alt.txt" 
04.
set "Aus=Datei_neu.txt" 
05.
set /a Len=1555 
06.
 
07.
setlocal EnableDelayedExpansion 
08.
set "Spaces=" 
09.
for /l %%i in (1,1,%Len%) do set "Spaces=!Spaces! " 
10.
<"%Pfad%%Ein%" >"%Pfad%%Aus%" ( 
11.
  for /f %%n in ('type "%Pfad%%Ein%"^|find /c /v ""') do for /l %%i in (1 1 %%n) do ( 
12.
    set "Zeile=" 
13.
    set /p "Zeile=" 
14.
    set "Zeile=!Zeile!%Spaces%" 
15.
    set "Zeile=!Zeile:~,%Len%!" 
16.
    echo(!Zeile! 
17.
18.
)
Grüße
rubberman

<EDIT auch wenns nun schon gelöst ist />
Bitte warten ..
Mitglied: FomerMay
29.12.2011 um 09:12 Uhr
Auch danke an rubberman

Es hat geklappt (sowohl die Erweiterung für meinen Code als auch die Beispiele von bastla und rubberman), ich hätte jetzt nur noch eine kleine Frage zu bastla's Code

01.
SET "neueZeile=%Zeile%%Spaces%" 
02.
setlocal enabledelayedexpansion 
03.
>>"%Pfad%%Aus%" echo(!neueZeile:~,%Len%! 
04.
endlocal
Wo liegt der Unterschiede ziwschen
01.
>>"%Pfad%%Aus%" echo(!neueZeile:~,%Len%!
und
01.
echo(!neueZeile:~,%Len%!)>>"%Pfad%%Aus%"
Bitte warten ..
Mitglied: bastla
29.12.2011, aktualisiert 18.10.2012
Hallo FomerMay!
Wo liegt der Unterschied
Deine Zeile (und damit auch die Ausgabe) enthält eine schließende Klammer ...

Die Schreibweise mit der öffnenden Klammer (hier von jeb-the-batcher empfohlen) ist ein Ersatz für "echo." oder "echo\" oder einige weitere mögliche Varianten, welche alle den Sinn haben, eine Leerzeile - und nicht im Fall des Falles
ECHO ist eingeschaltet (ON).
- zu erzeugen (wäre hier zwar nicht erforderlich, aber schadet auch nicht).

Grüße
bastla
Bitte warten ..
Mitglied: Biber
29.12.2011 um 12:42 Uhr
Moin FomerMay,

willkommen im Forum auch von mir.

Die von bastla verwendete Schreibweise hat mehrere Vorteile.

Zum einen hilft es, unbeabsichtige Nebeneffekte zu vermeiden, wenn der rausgeECHOte String mit einer Ziffer endet.
In diesem Fall [also "Ziffer-Umleitungsanweissung-Umleitungsziel" z.B. "echo test 1>logfile.txt") würde eine Fehlinterpretation erfolgen.
Der CMD-Interpreter würde es "lesen" als "Mach mir ein Echo test" und leite alles auf Ausgabekanal 1 erscheinende um in logfie.txt"

Statt "test 1" würde also nur "test" in der Logdatei ankommen

Hauptgrund ist aber die Les- und Wartbarkeit von Schnipseln.

Vergleiche einfach dieses Beispiel:

01.
... 
02.
echo Hier lege ich meine neue Logdatei an>%Pfad%%Aus% 
03.
echo Nu hänge ich einen mittellangen Text an, weil es dann nicht so langweilig zu lesen ist.>>%Pfad%%Aus% 
04.
 
05.
REM Zwischendurch irgendwelche Aufgaben des Schnipsels... 
06.
 
07.
echo Und noch einen kurzen Text am Ende>>%Pfad%%Aus%
Dasselbe in anderer Schreibweise

01.
... 
02.
 >%Pfad%%Aus% echo Hier lege ich meine neue Logdatei an 
03.
>>%Pfad%%Aus% echo Nu hänge ich einen mittellangen Text an, weil es dann nicht so langweilig zu lesen ist. 
04.
 
05.
REM Zwischendurch irgendwelche Aufgaben des Schnipsels... 
06.
 
07.
>>%Pfad%%Aus% echo Und noch einen kurzen Text am Ende
Die zweite Variante ist einfach leichter zu lesen und zu pflegen..

Grüße
Biber
Bitte warten ..
Ähnliche Inhalte
Batch & Shell
Textdatei zeilenweise in Variable schreiben
gelöst Frage von goodbytesBatch & Shell20 Kommentare

Hallo, mit einer Batch möchte ich mehrere Laufwerke mappen, abhängig vom Usernamen. Klar könnte ich auch für jeden User ...

Batch & Shell
Batch: Textdatei Zeilenweise auslesen
gelöst Frage von CreatorXBatch & Shell2 Kommentare

Hallo, ich weiß, zu dem Thema gibt es schon unzählige Threads. Ich hab auch einiges dazu gefunden und trotzdem ...

Batch & Shell
Textdatei Zeile für Zeile auslesen
Frage von RIPUEDBatch & Shell

Hallo, ich würde gerne mit einem Batch-Skript Zeilen aus einer Textdatei einzeln und nacheinander auslesen und diese dann nach ...

Batch & Shell
Erstellungsdatum vor jede Zeile einer Textdatei schreiben
gelöst Frage von freakonaleashBatch & Shell5 Kommentare

Hallo zusammen, ich habe einen Ordner mit ganz vielen Textdateien. Ich bräuchte eine Batch, die in jede Datei vor ...

Neue Wissensbeiträge
Batch & Shell

Open Object Rexx: Eine mittlerweile fast vergessene Skriptsprache aus dem Mainframebereich

Information von Penny.Cilin vor 19 StundenBatch & Shell8 Kommentare

Ich kann mich noch sehr gut an diese Skriptsprache erinnern und nutze diese auch heute ab und an noch. ...

Humor (lol)

"gimme gimme gimme": Automatischer Test stolpert über Easter Egg im man-Tool

Information von Penny.Cilin vor 21 StundenHumor (lol)6 Kommentare

Interessant, was man so alles als Easter Egg implementiert. Ist schon wieder Ostern? "gimme gimme gimme": Automatischer Test stolpert ...

MikroTik RouterOS

Mikrotik - Lets Encrypt Zertifikate mit MetaROUTER Instanz auf dem Router erzeugen

Anleitung von colinardo vor 1 TagMikroTik RouterOS8 Kommentare

Einleitung Folgende Anleitung ist aus der Lage heraus entstanden das ein Kunde auf seinem Mikrotik sein Hotspot Captive Portal ...

Sicherheit

Sicherheitslücke in HP-Druckern - Firmware-Updates stehen bereit

Information von BassFishFox vor 1 TagSicherheit1 Kommentar

Ein weiterer Grund, dass Drucker keinerlei Verbindung nach "auswaerts" haben sollen. Unter Verwendung spezieller Malware können Angreifer aus der ...

Heiß diskutierte Inhalte
Windows Server
RDP macht Server schneller???
Frage von JaniDJWindows Server17 Kommentare

Hallo Community, wir betrieben seit geraumer Zeit diverse virtuelle Maschinen und Server mit Windows Server 2012. Leider haben wir ...

Windows 10
Bitlocker nach Verschlüsselung nicht mehr aufrufbar!
gelöst Frage von alexlazaWindows 1013 Kommentare

Hallo, ich besitze ein HP ZBook 17 G4 mit einem Windows 10 Pro Betriebssystem. Bei diesem Problem handelt sich, ...

Off Topic
Fachkräftemangel in Deutschland? - Talentschmiede schreibt alle 2 Tage die gleichen Stellen aus
Frage von Penny.CilinOff Topic12 Kommentare

Hallo, haben wir in Deutschland Fachkräftemangel? Die Talentschmiede schreibt gefühlt alle zwei Tage dieselben Stellen aus. Und das schon ...

Windows Server
Sichere Remote Desktop Verbindung wie?
gelöst Frage von nuss33Windows Server11 Kommentare

Hallo zusammen, eins vorweg: Ich besitze einen privaten Windows Server 2008 R2 zu Hause im Netzwerk er wird nicht ...