mctini
Goto Top

VBS - bestimmte Zeilen löschen

aus einer Text Datei bestimmte Zeilen löschen

Ich möchte gerne aus einer Text Datei bestimmte Zeilen löschen.

AUs der Text Datei möchte ich alle Zeilen löschen die am Anfang |S| stehen haben.


Content-ID: 106153

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

Ausgedruckt am: 15.11.2024 um 21:11 Uhr

Turrex0100
Turrex0100 15.01.2009 um 15:50:37 Uhr
Goto Top
kenne mich zwar kaum aus, aber ich könnte mir denken das es schwierig wird weil der | auch ein befehlszeichen ist oder?
bastla
bastla 15.01.2009 um 16:12:37 Uhr
Goto Top
@Turrex0100
ich könnte mir denken das es schwierig wird weil der | auch ein befehlszeichen ist oder?
Nein und nein. face-wink

Das zweite "Nein" nicht nur, weil VBS gefragt war, sondern auch in Batch "|", wenn zwischen Anführungszeichen verwendet, als gewöhnliches Zeichen behandelt werden kann (und anderenfalls durch ein vorangestelltes "^" maskiert werden könnte) - Beispiel:
findstr /b /v "|S|" D:\Datei.txt>D:\Datei_neu.txt
In VBS etwa so:
Set fso = CreateObject("Scripting.FileSystemObject")  
DateiEin = "D:\Datei.txt"  
DateiAus = "D:\Datei_neu.txt"  
T = Split(fso.OpenTextFile(DateiEin).ReadAll, vbCrLF)
Set Ausgabe = fso.CreateTextFile(DateiAus, True)
For Each Z In T
   If Left(Z, 3) <> "|S|" Then Ausgabe.WriteLine Z  
Next
Ausgabe.Close
Grüße
bastla
mctini
mctini 15.01.2009 um 16:36:03 Uhr
Goto Top
Gerne probiere ich auch Dein Script. Auf jeden Fall sieht es wesentlich konfortabler aus.

Hier meins
'InsertText.vbs 02.
SourceFile = "c:\dep.txt"
Pos = 1
InsertText = ""

MStart = "|S|"
MEnd = "*END*"
BakExt = ".bak"

If WScript.Arguments.Count > 0 Then SourceFile = WScript.Arguments(0)
BakFile = SourceFile & BakExt
TargetFile = SourceFile

Set fso = CreateObject("Scripting.FileSystemObject")
If Not fso.FileExists(TargetFile) Then
WScript.Echo TargetFile & " konnte nicht gefunden werden!"
WScript.Quit(1)
End If
If fso.FileExists(BakFile) Then fso.DeleteFile(BakFile)
fso.MoveFile TargetFile, BakFile
Lines = Split(fso.OpenTextFile(BakFile, 1, False).ReadAll, vbCrLF)

Set Target = fso.OpenTextFile(TargetFile, 2, True)

Ins = False
For Each Line In Lines
If InStr(Line, MStart) Then
Ins = True
ElseIf InStr(Line, MEnd) Then
Ins = False
Else
LineNew = Line
If Ins Then If Len(Line) >= (Pos - 1) Then LineNew = Left(Line, Pos - 1) & InsertText & Mid(Line, Pos)
Target.WriteLine LineNew
End If
Next

Target.Close
bastla
bastla 15.01.2009, aktualisiert am 18.10.2012 um 18:37:37 Uhr
Goto Top
Hallo mctini!

Deines war damals für einen etwas anderen Zweck gedacht ...

Grüße
bastla
mctini
mctini 15.01.2009 um 16:43:49 Uhr
Goto Top
Hi bastla

genial bist du und sei dank geht prima

würde es dir etwas aus machen noch ein kommentar zu zeile 4 -7 zu schreiben
mctini
mctini 15.01.2009 um 17:01:43 Uhr
Goto Top
Vielleicht kannst du mir ja noch sagen wie dann nur die ersten 32 Zeile darstelle. Alles was dannach kommt ist uninteressant.
bastla
bastla 15.01.2009 um 18:08:32 Uhr
Goto Top
Hallo mctini!

Kurz der gewünschte Kommentar:

Zeile 4: Lese den gesamten Inhalt der Textdatei ein und teile ihn in Zeilen auf (Trennzeichen ist "vbCrLF", also die "Windows-Zeilenschaltung") - Ergebnis: Nach dieser Zeile enthät das Array T(0) bis T(Zeilenanzahl - 1) die einzelnen Zeilen der Textdatei.

Zeile 5: Erzeuge eine neue Textdatei als Objekt (damit in Zeile 7 bei Bedarf in diese Datei geschrieben werden kann).

Zeile 6: Eine Schleife über alle Elemente des Arrays T (= über alle Zeilen), wobei die jeweils aktuelle Zeile in die Variable Z gestellt wird.

Zeile 7: Wenn die ersten 3 Zeichen der Zeile nicht dem Suchstring (hier gleich als Konstante "|S|" eingetragen) entsprechen, schreibe diese Zeile in die Ergebnisdatei - damit werden alle Zeilen, die mit dem Suchstring beginnen weg gelassen ...
Wenn Du nur die ersten 32 Zeilen benötigst, muss die Schleife ein wenig anders aussehen:
Anzahl = 31 'Zählung beginnt bei 0  
If UBound(T) < Anzahl Then Anzahl = UBound(T) 'falls es weniger als 32 Zeilen gibt, nimm eben alle  
For i = 0 To Anzahl
    If Left(T(i), 3) <> "|S|" Then Ausgabe.WriteLine T(i) 'per Index i direkter Zugriff auf die Arrayelemente von T  
Next
Grüße
bastla
mctini
mctini 16.01.2009 um 09:04:36 Uhr
Goto Top
Super, vielen Dank

Leider geht das noch nicht richtig. Es werden nun alle Zeilen weggelöscht

Alle mit |S| sollen weg und der Rest sind z.B. 100 Zeilen davon soll er Anzahl behalten
bastla
bastla 16.01.2009, aktualisiert am 14.11.2012 um 17:33:30 Uhr
Goto Top
Hallo mctini!

Hatte ich leider anders interpretiert: "Nur die erten 32 Zeilen der Datei sollen untersucht werden".

Um 32 Zeilen ohne "|S|" zu behalten sähe die Schleife etwa so aus:
Anzahl = 32
Geschrieben = 0
For Each Z In T 
    If Left(Z, 3) <> "|S|" Then  
        If Geschrieben < Anzahl Then
            Ausgabe.WriteLine Z
            Geschrieben = Geschrieben + 1
            'If Geschrieben >= Anzahl Then Exit For  
        End If
    End If
Next
Die auskommentierte Zeile 8 könnte zur Performance-Verbesserung verwendet werden: Nach dem Erreichen der Gesamtanzahl kann die Schleife verlassen werden. Falls dies gewünscht ist, einfach den Apostroph entfernen ...

Grüße
bastla
Turrex0100
Turrex0100 16.01.2009 um 19:32:26 Uhr
Goto Top
@bastla

gut gut...
bin mit batch etwas mehr vertraut und kenn es da nur als befehlszeichen.....

war auch nur ne idee.

bin um alles was ich lerne dankbar

lg Turrex
suse-5-0
suse-5-0 20.01.2009 um 11:51:13 Uhr
Goto Top
C:\>grep -v "^|S|" csvtest.txt  
XWXX|G|BA 963|Rechner|2009-01-15|07:15|||||
XWXX|G|BA 963|Rechner|2009-01-15|07:15||||
XWXX|G|BA 963|Rechner|2009-01-15|07:15|||||
|XWXX|G|BA 963|Rechner|2009-01-15|07:15|||||
XWXX|G|BA 963|Rechner|2009-01-15|07:15|||||
XWXX|G|BA 963|Rechner|2009-01-15|07:15|||||

und danach natürlich noch in die gewünschte Datei > pipen.

grep für Windows gibt es unter
http://unxutils.sourceforge.net/
bastla
bastla 20.01.2009 um 14:36:45 Uhr
Goto Top
@suse-5-0
In diesem Fall genügte (wäre nicht VBS gefragt gewesen) auch die CMD-Shell:
findstr /v "^|S|" csvtest.txt
Grüße
bastla