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

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, 3820 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 ..
Neuester Wissensbeitrag
Humor (lol)

Linkliste für Adventskalender

(3)

Information von nikoatit zum Thema Humor (lol) ...

Ähnliche Inhalte
Batch & Shell
gelöst BATCH: Daten aus Textdatei auslesen und in neue Textdatei separieren (9)

Frage von Manuel1234 zum Thema Batch & Shell ...

Windows Systemdateien
gelöst Registry-Schlüssel per Batch auslesen und in Datei schreiben (9)

Frage von Philzip zum Thema Windows Systemdateien ...

Batch & Shell
gelöst DWORD (Name immer verschieden) eines RegKeys auslesen und in Variable schreiben (2)

Frage von reissaus73 zum Thema Batch & Shell ...

Heiß diskutierte Inhalte
Windows Server
DHCP Server switchen (25)

Frage von M.Marz zum Thema Windows Server ...

SAN, NAS, DAS
gelöst HP-Proliant Microserver Betriebssystem (14)

Frage von Yannosch zum Thema SAN, NAS, DAS ...

Grafikkarten & Monitore
Win 10 Grafikkarte Crash von Software? (13)

Frage von Marabunta zum Thema Grafikkarten & Monitore ...

Windows 7
Verteillösung für IT-Raum benötigt (12)

Frage von TheM-Man zum Thema Windows 7 ...