leerzeichen und leerzeilen aufspüren in txt Format
OS: Win 2000 oder/und ME
Dateien sind im normalen txt Format
Hallo erstmal
habe folgendes problem:
(angenommen _= )dann sehen die Zeilen in etwas so aus:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
(bekomms leider nicht anschaulicher hin, is nich möglich mehrere Leerzeichen aneinander zu machen)
Meistens sind die Leerzeichen in der letzten Zeile.
Für meine Anwendungen ist diese Zeile nicht verarbeitbar,
weiter ist eine leere Zeile für diese Anwendung das ende der Datei.
Zusatzinfo einige Zeilen beginnen aber mir einem leerzeichen und darauf folgt dann Text.
die Ursache habe ich auch recht schnell gefunden.
Benutze eine far.exe (FindAndRepace) um Zeichenketten in einer Datei (die leider nicht immer an der gleichen stelle stehen) zu ersetzen, diese exe macht am ende jeder Datei leider so ca 120 bis 375 leerzeichen.
(für bessere möglichkeiten als far.exe habe ich immer ein Ohr offen
Weiter habe ich durch Benutzerunachtsamkeiten auch ab und zu Zeilen in denen nichts steht(LEERZEILEN), mitten in der Datei - wie oben beschreiben endet für meine Anwendung hier die Datei und der rest wird nicht bearbeitet.
nun suche ich eine möglichkeit diese LEERZEICHEN und LEERZEILEN entweder
über eine chk.bat mit einer fehlermeldung like:"achtung Datei enthält Leerzeile(Zeile 147)"
oder einer korregierdatei mit der ich dann per Darg&Drop Dateien bereinigen kann
Nebenbei habe ich ein kleines prob mit einer BAT die mit xcopy Ordner kopieren sollte,
nach den ausführen kommt die frage ob das Ziel ein Ordner oder eine Datei ist
leider weis ich auswendig nicht welche /X befehle ich nach xcopy gesetzt habe.
werde morgen nochmal gucken falls es keinen Vorschlag gibt
Hoffe das jemand nen Lösungsvorschlag parat hat
mfg
Dateien sind im normalen txt Format
Hallo erstmal
habe folgendes problem:
(angenommen _= )dann sehen die Zeilen in etwas so aus:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
(bekomms leider nicht anschaulicher hin, is nich möglich mehrere Leerzeichen aneinander zu machen)
Meistens sind die Leerzeichen in der letzten Zeile.
Für meine Anwendungen ist diese Zeile nicht verarbeitbar,
weiter ist eine leere Zeile für diese Anwendung das ende der Datei.
Zusatzinfo einige Zeilen beginnen aber mir einem leerzeichen und darauf folgt dann Text.
die Ursache habe ich auch recht schnell gefunden.
Benutze eine far.exe (FindAndRepace) um Zeichenketten in einer Datei (die leider nicht immer an der gleichen stelle stehen) zu ersetzen, diese exe macht am ende jeder Datei leider so ca 120 bis 375 leerzeichen.
(für bessere möglichkeiten als far.exe habe ich immer ein Ohr offen
Weiter habe ich durch Benutzerunachtsamkeiten auch ab und zu Zeilen in denen nichts steht(LEERZEILEN), mitten in der Datei - wie oben beschreiben endet für meine Anwendung hier die Datei und der rest wird nicht bearbeitet.
nun suche ich eine möglichkeit diese LEERZEICHEN und LEERZEILEN entweder
über eine chk.bat mit einer fehlermeldung like:"achtung Datei enthält Leerzeile(Zeile 147)"
oder einer korregierdatei mit der ich dann per Darg&Drop Dateien bereinigen kann
Nebenbei habe ich ein kleines prob mit einer BAT die mit xcopy Ordner kopieren sollte,
nach den ausführen kommt die frage ob das Ziel ein Ordner oder eine Datei ist
leider weis ich auswendig nicht welche /X befehle ich nach xcopy gesetzt habe.
werde morgen nochmal gucken falls es keinen Vorschlag gibt
Hoffe das jemand nen Lösungsvorschlag parat hat
mfg
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 40577
Url: https://administrator.de/contentid/40577
Ausgedruckt am: 13.11.2024 um 22:11 Uhr
14 Kommentare
Neuester Kommentar
Hallo Michael!
Für XCOPY meinst Du vermutlich den Schalter /I
Bezüglich der Korrekturdatei müsste klar gestellt werden, in welchen genau definierten Fällen welche genau definierten Korrekturen erfolgen sollen.
Zum Überprüfen folgender Entwurf:
Wenn der obige Code zB als C:\Meine Scripts\BlankCheck.vbs gespeichert wird, kann er wie folgt aufgerufen werden:
--> "C:\Testdatei.txt" überprüfen und (bei Fehlern) Log in "C:\LogBlanks.txt" schreiben
--> "C:\Testdatei.txt" überprüfen und (bei Fehlern) Log in "C:\AnderesLog.txt" schreiben
Da auch ein Fehlercode zurückgegeben wird (2 = keine Testdatei übergeben bzw nicht gefunden, 1 = Fehler entdeckt, 0 = OK) kann (bei Batch-Einsatz) auf die WScript.Echo-Zeilen verzichtet werden.
Soll keine spezielle Log-Datei verwendet werden, kann die Überprüfung auch interaktiv per Drag & Drop der Testdatei auf die VBS-Datei erfolgen.
<Edit> Überprüfung auf Existenz der übergebenen Testdatei hinzugefügt. </Edit>
HTH
bastla
Für XCOPY meinst Du vermutlich den Schalter /I
Bezüglich der Korrekturdatei müsste klar gestellt werden, in welchen genau definierten Fällen welche genau definierten Korrekturen erfolgen sollen.
Zum Überprüfen folgender Entwurf:
If WScript.Arguments.Count = 0 Then
WScript.Echo "Bitte zumindest die zu prüfende Datei als Parameter übergeben!"
WScript.Quit(2)
End If
sDatei = WScript.Arguments(0)
If WScript.Arguments.Count >1 Then
sLog = WScript.Arguments(1)
Else
sLog = "C:\LogBlanks.txt" 'bitte Pfad anpassen
End If
sLogText = ""
lLineNumber = 0
lErrors = 0
lLastBlankLine = 0
Set fso = CreateObject("Scripting.FileSystemObject")
If Not fso.FileExists(sDatei) Then
WScript.Echo "Datei " & sDatei & " nicht gefunden!"
WScript.Quit(2)
End If
Set oFile = fso.OpenTextFile(sDatei, 1)
Do While Not oFile.AtEndOfStream
sLine = oFile.ReadLine
lLineNumber = lLineNumber + 1
If Trim(sLine) = "" Then 'Leerzeile
sLogText = sLogText & "Zeile " & CStr(lLineNumber) & ": Leerzeile" & vbCrLF
lErrors = lErrors + 1
lLastBlankLine = lLineNumber
'Nummer der Letzten Leerzeile speichern, um zu sehen, ob der einzige
'gefundene "Fehler" die abschließende Leerzeile ist.
End If
If Right(sLine, 2) = Space(2) Then 'mindestens 2 aufeinanderfolgende Leerzeichen am Ende
sLogText = sLogText & "Zeile " & CStr(lLineNumber) & ": Leerzeichen" & vbCrLF
lErrors = lErrors + 1
End If
Loop
oFile.Close
'Wurde nur die letzte Leerzeile als "Fehler" erkannt --> keinen Fehler anzeigen
If lErrors = 1 Then
If lLastBlankLine = lLineNumber Then
WScript.Echo "Keine Fehler gefunden!"
WScript.Quit(0)
End If
End If
If lErrors > 0 Then
WScript.Echo "Es wurden " & CStr(lErrors) & " Fehler gefunden (siehe Log)!"
Set oLogFile = fso.OpenTextFile(sLog, 2, True)
'8 anstelle von 2 erstellt keine neue Datei, sondern hängt an vorhandene an
oLogFile.WriteLine "Geprüfte Datei: " & sDatei
oLogFile.Write sLogText
oLogFile.Close
'Logdatei anzeigen
Set oShell = WScript.CreateObject ("WScript.Shell")
oShell.Run "notepad.exe " & sLog
WScript.Quit(1)
End If
WScript.Echo "Keine Fehler gefunden, aber letzte Zeile nicht leer!"
Wenn der obige Code zB als C:\Meine Scripts\BlankCheck.vbs gespeichert wird, kann er wie folgt aufgerufen werden:
CScript //nologo "C:\Meine Scripts\BlankCheck.vbs" C:\Testdatei.txt
CScript //nologo "C:\Meine Scripts\BlankCheck.vbs" C:\Testdatei.txt C:\AnderesLog.txt
Da auch ein Fehlercode zurückgegeben wird (2 = keine Testdatei übergeben bzw nicht gefunden, 1 = Fehler entdeckt, 0 = OK) kann (bei Batch-Einsatz) auf die WScript.Echo-Zeilen verzichtet werden.
Soll keine spezielle Log-Datei verwendet werden, kann die Überprüfung auch interaktiv per Drag & Drop der Testdatei auf die VBS-Datei erfolgen.
<Edit> Überprüfung auf Existenz der übergebenen Testdatei hinzugefügt. </Edit>
HTH
bastla
Moin WindowsUser1984,
ALT: Echo %NOWLINE%>>%FILE2%
in NEU: (Echo %NOWLINE%)>>%FILE2%
Die Ziffern 0-4 haben untern dem CMD eine doppelte Bedeutung - die bezeichnen gleichzeitig die Ein/Ausgabekanäle wie
0 =STDIN=CON: Konsole (im Sinne von Tastatur),
1= STDOUT= CON:=Konsole (im Sinne von Bildschirm),
2= STDERR=Fehlerausgabe=CON=Konsole
3= STDAUX (und meistens STDDBG)
4= STDPRN = Drucker
Wenn also eine Ziffer Eins (direkt) vor dem Größerzeichen steht, heißt das:
Leite Kanal 1, also Bildschirmmeldungen, um nach ...(z.B. %FILE%).
Sprich: Alles, aber außer der Ziffer "1" selbst, wird in die Datei geleitet.
Wenn eine Ziffer Vier (direkt) vor dem Größerzeichen steht, heißt das:
Leite Kanal 4, also alles, was zum Drucker geschickt wird vom vorangegangenen Befehl, um nach ...(z.B. %FILE%).
Da aber gar nichts zum Drucker geschickt wurde, landet auch nichts in der Datei %FILE%.
Der Rest (vor der "4") dürfte zwar kurz auf dem Bildschirm auftauchen, aber das hilft Dir ja nix.
Gruß
Biber
was mach ich falsch?
Du denkst nicht daran, wie blöd es manchmal laufen kann...was kann ich ändern?
Ändere die Zeile:ALT: Echo %NOWLINE%>>%FILE2%
in NEU: (Echo %NOWLINE%)>>%FILE2%
Die Ziffern 0-4 haben untern dem CMD eine doppelte Bedeutung - die bezeichnen gleichzeitig die Ein/Ausgabekanäle wie
0 =STDIN=CON: Konsole (im Sinne von Tastatur),
1= STDOUT= CON:=Konsole (im Sinne von Bildschirm),
2= STDERR=Fehlerausgabe=CON=Konsole
3= STDAUX (und meistens STDDBG)
4= STDPRN = Drucker
Wenn also eine Ziffer Eins (direkt) vor dem Größerzeichen steht, heißt das:
Leite Kanal 1, also Bildschirmmeldungen, um nach ...(z.B. %FILE%).
Sprich: Alles, aber außer der Ziffer "1" selbst, wird in die Datei geleitet.
Wenn eine Ziffer Vier (direkt) vor dem Größerzeichen steht, heißt das:
Leite Kanal 4, also alles, was zum Drucker geschickt wird vom vorangegangenen Befehl, um nach ...(z.B. %FILE%).
Da aber gar nichts zum Drucker geschickt wurde, landet auch nichts in der Datei %FILE%.
Der Rest (vor der "4") dürfte zwar kurz auf dem Bildschirm auftauchen, aber das hilft Dir ja nix.
Gruß
Biber
Hallo Mike!
Falls ich Dich richtig verstehe, willst Du aus einer Textdatei alle Leerzeilen und alle am Ende einer Zeile befindlichen Leerstellen entfernen und das Ergebnis in eine neue Datei schreiben.
Kommen in der Datei auch Zeilen mit führenden Leerstellen vor und müssen diese erhalten bleiben? Falls sie wegfallen können, müsste folgendes klappen:
CleanBlanks.vbs
Aufruf mit:
Grüße
bastla
@Biber
Immerhin Zweiter
Falls ich Dich richtig verstehe, willst Du aus einer Textdatei alle Leerzeilen und alle am Ende einer Zeile befindlichen Leerstellen entfernen und das Ergebnis in eine neue Datei schreiben.
Kommen in der Datei auch Zeilen mit führenden Leerstellen vor und müssen diese erhalten bleiben? Falls sie wegfallen können, müsste folgendes klappen:
CleanBlanks.vbs
If WScript.Arguments.Count <> 2 Then
WScript.Echo "Verwendung: CScript CleanBlanks.vbs Quelldatei Zieldatei"
WScript.Quit(2)
End If
sQDatei = WScript.Arguments(0)
sZDatei = WScript.Arguments(1)
Set fso = CreateObject("Scripting.FileSystemObject")
If Not fso.FileExists(sQDatei) Then
WScript.Echo "Datei " & sQDatei & " nicht gefunden!"
WScript.Quit(2)
End If
Set oQDatei = fso.OpenTextFile(sQDatei, 1)
Set oZDatei = fso.OpenTextFile(sZDatei, 2, True) 'bereits existierende Zieldatei wird überschrieben
Do While Not oQDatei.AtEndOfStream
sZeile = Trim(oQDatei.ReadLine)
If sZeile <> "" Then oZDatei.WriteLine sZeile
Loop
oQDatei.Close
oZDatei.Close
Aufruf mit:
CScript //nologo "C:\Meine Scripts\CleanBlanks.vbs" "C:\Datei mit Leerzeichen.txt" "C:\Datei ohne Leerzeichen.txt"
Grüße
bastla
@Biber
Immerhin Zweiter
Das ist aber auch ein Drama... *ggg
Und ich sach' noch "Du kannst gar nicht so blöd denken, wie es kommt.."
Ich geb zu - an den Fall hatte ich auch nicht gedacht.
Aber noch bin ich nicht am Ende mit meinen Alternativen.
Dann also diese zuletzt geänderte Zeile wie folgt ändern:
...somit jetzt doch wieder ohne Klammern.
Die Ziffern 0....4 werden trotzdem geschrieben, falls sie am Ende der Zeile stehen.
Kleine Demo dazu:
Grüße
Biber
P.S. Aber sicherlich "schneller" (relativ) und wesentlich pflegbarer ist bastla's VBS-Trimmer-Trümmer.
Und ich sach' noch "Du kannst gar nicht so blöd denken, wie es kommt.."
Ich geb zu - an den Fall hatte ich auch nicht gedacht.
Aber noch bin ich nicht am Ende mit meinen Alternativen.
Dann also diese zuletzt geänderte Zeile wie folgt ändern:
[Von:](echo %NOWLINE%)>>%FILE2%
[In: ]>>%FILE2% echo %NOWLINE%
...somit jetzt doch wieder ohne Klammern.
Die Ziffern 0....4 werden trotzdem geschrieben, falls sie am Ende der Zeile stehen.
Kleine Demo dazu:
>echo %nowline%
das ist jetzt nur ein Test :)
#### Variable mit Klammer am Ende
>echo %nowline%1
das ist jetzt nur ein Test :)1
#### ohne explizites Umleitungs-Größer-Zeichen klappts auch mit Ziffer "1" am Ende
>echo %nowline%1>con
das ist jetzt nur ein Test :)
#### die "1" am Ende geht verloren bei der Umleitung mit Größerzeichen
>>con echo %nowline%1
das ist jetzt nur ein Test :)1
#### auch die "1" am Ende wird mit umgeleitet
>(echo %nowline%)
")" ist syntaktisch an dieser Stelle nicht verarbeitbar.
### der von WindowsUser1984 beschriebene Fehler
Grüße
Biber
P.S. Aber sicherlich "schneller" (relativ) und wesentlich pflegbarer ist bastla's VBS-Trimmer-Trümmer.