windowsuser1984
Goto Top

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 face-wink

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

Content-Key: 40577

Url: https://administrator.de/contentid/40577

Printed on: April 19, 2024 at 22:04 o'clock

Member: bastla
bastla Sep 21, 2006 at 06:03:42 (UTC)
Goto Top
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:

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 
--> "C:\Testdatei.txt" überprüfen und (bei Fehlern) Log in "C:\LogBlanks.txt" schreiben

CScript //nologo "C:\Meine Scripts\BlankCheck.vbs" C:\Testdatei.txt C:\AnderesLog.txt 
--> "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
Member: WindowsUser1984
WindowsUser1984 Sep 21, 2006 at 22:21:23 (UTC)
Goto Top
supa,
dachte bis heute mittag das da nix zu machen ist und nun seh ich diese schönen Zeilen
habs gleich an ner test dat.ei ausprobiert
super !!
erstmal vielen vielen dank

Nur noch eine kleine modifikation.
Warscheinlich war meine Problembeschreibung einfach mal wieder zu uneindeutig!?
Es dürfen schon Leerzeichen darin vorkommen auch mehr als 2 hintereinander nur nicht hinter dem Text, also am ende der Zeile max 1 Leerzeichen.

Kann leider kein Beispiel einfügen bekomm das nich hin.
Mir wird immer meine Leerzeichenkette zu einem einzigen zusammengefasst *grml*
selbst mit ´´ ......

also das wenn noch machbar ist wäre SUPER, habs schon ne ganze zeit mit bat's versucht und nich hinbekommen(for überspringt leerzeilen einfach)
bin aber auch noch relatv unerfahren und mit vbs hab ich noch nie gearbeitet wobei es nich schwer aussieht ... mal schauen

mfg Mike
Member: bastla
bastla Sep 22, 2006 at 05:52:02 (UTC)
Goto Top
Hallo Mike!

Ich habe das Script oben entsprechend modifiziert (Überprüfung auf mindestens 2 Leerzeichen am Ende der Zeile).

Für Weiteres habe ich frühestens gegen 17:00 Uhr Zeit.


HTH
bastla
Member: WindowsUser1984
WindowsUser1984 Sep 22, 2006 at 09:38:23 (UTC)
Goto Top
Hallo
bin super zufrieden =D

sogar mit features:
-aufrufbefehl aus einer batch
-logdatei
-errorlevel zur weiterverarbeitung
-möglichkeit zu wählen zwischen kontinuierlichen loggen und last File log

einfach GROSSE klasse
``*beifallklatsch*

thx 4 ur time
have a nice day
Member: bastla
bastla Sep 22, 2006 at 15:57:23 (UTC)
Goto Top
Hallo Mike!

Danke für die Blumen ...

Freut mich, wenn's passt.

Schönes Wochenende
bastla
Member: WindowsUser1984
WindowsUser1984 Oct 24, 2006 at 14:18:35 (UTC)
Goto Top
Hi nochmal
habe mich nun daran gemacht eine datei zu basteln die alle leerzeilen und leerzeichen nach TEXT entfernt

das mit den leerzeilen ging noch ganz schnell da die forschleife leerzeilen einfach überspringt
nun wollte ich mit dieser schleife gleichzeitig die leerzeichen entfernen

mit For wird Zeile aus der zu prüfenden Datei ausgelesen(weis ich auswendig jetzt nimmer) > weiter mit SET NOWLINE=%%i
und call :CHKLINE

goto :eof
:CHKLINE
SET ENDLINECHK=%NOWLINE:~1%
if "%ENDLINECHK%"==" " SER NOWLINE=%NOWLINE:~0,-1%
if not "%ENDLINECHK%"==" " goto :LINEFIXED
goto CHKLINE
:LINEFIXED
echo %NOWLINE%>>%FILE2%
goto :eof

so in etwa, bin mir nichtmehr sicher
das funktioniert auch teilweise aber ab und zu wenn eine Zahl (zB 4) am ende steht
erscheint die zeile im Fenster aber nicht in der Datei
wenn echo an ist sehe ich die Zeile auch aber entdecke keinen Fehler
zB:

echo asdf asdf asdf asdf 4>>C:\AAA\BBB\CCC\DATEI.FIX

was mach ich falsch?
was kann ich ändern?

mfg Mike
Member: Biber
Biber Oct 24, 2006 at 14:32:21 (UTC)
Goto Top
Moin WindowsUser1984,
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
Member: bastla
bastla Oct 24, 2006 at 14:50:35 (UTC)
Goto Top
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
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 face-wink
Member: WindowsUser1984
WindowsUser1984 Oct 24, 2006 at 20:26:14 (UTC)
Goto Top
nun gut das wusste ich nicht ich probiers dann gleich aus
thx
Member: WindowsUser1984
WindowsUser1984 Oct 24, 2006 at 20:28:10 (UTC)
Goto Top
leider beginnen auch zeilen mit leerzeichen, ja
und diese müssen auch erhalten bleiben ....
trozdem danke für deine mühe
villt kann es ein anderer leser gebrauchen

thx
Member: bastla
bastla Oct 25, 2006 at 06:28:09 (UTC)
Goto Top
Hallo Mike!

Zur Ergänzung:

Um nur die Leerzeichen am Ende zu elimieren, ändert sich im Script oben nur eine Zeile (oder, genauer gesagt, ein Buchstabe in dieser Zeile):

sZeile = RTrim(oQDatei.ReadLine)

HTH
bastla
Member: WindowsUser1984
WindowsUser1984 Oct 25, 2006 at 15:11:28 (UTC)
Goto Top
so nun komm ich halt nochmal angekrochen ....
immernoch die gleiche situation!

nun klappt es auch mit den zahlen am ende
aber in der
Datei ist eine schließende Klammer ) an dieser stelle bricht die for schleife ab und die restliche Datei wird nicht bearbeitet...

Bitte nochmals um Hilfe ....
Member: bastla
bastla Oct 25, 2006 at 15:16:51 (UTC)
Goto Top
Hallo Mike!

Magst nicht doch das VBScript nehmen face-wink (jetzt mit auf das Zeilenende eingeschränkter Reinigungskraft - siehe unten)?

Grüße
bastla
Member: Biber
Biber Oct 25, 2006 at 15:48:13 (UTC)
Goto Top
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:
[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.