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

VBS - bestimmte Zeilen löschen

Frage Entwicklung VB for Applications

Mitglied: mctini

mctini (Level 1) - Jetzt verbinden

15.01.2009, aktualisiert 18.10.2012, 13967 Aufrufe, 12 Kommentare

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.


|S|AA 3918|Host01|2009-01-15|07:10|||A35|7|
XWXX|G|BA 963|Rechner|2009-01-15|07:15|||||
|S|AA 3918|Host01|2009-01-15|07:10|||A35|7|
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|||||
|S|AA 3918|Host01|2009-01-15|07:10|||A35|7|
XWXX|G|BA 963|Rechner|2009-01-15|07:15|||||
|S|AA 3918|Host01|2009-01-15|07:10|||A35|7|
XWXX|G|BA 963|Rechner|2009-01-15|07:15|||||
Mitglied: Turrex0100
15.01.2009 um 15:50 Uhr
kenne mich zwar kaum aus, aber ich könnte mir denken das es schwierig wird weil der | auch ein befehlszeichen ist oder?
Bitte warten ..
Mitglied: bastla
15.01.2009 um 16:12 Uhr
@Turrex0100
ich könnte mir denken das es schwierig wird weil der | auch ein befehlszeichen ist oder?
Nein und nein.

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:
01.
Set fso = CreateObject("Scripting.FileSystemObject") 
02.
DateiEin = "D:\Datei.txt" 
03.
DateiAus = "D:\Datei_neu.txt" 
04.
T = Split(fso.OpenTextFile(DateiEin).ReadAll, vbCrLF) 
05.
Set Ausgabe = fso.CreateTextFile(DateiAus, True) 
06.
For Each Z In T 
07.
   If Left(Z, 3) <> "|S|" Then Ausgabe.WriteLine Z 
08.
Next 
09.
Ausgabe.Close
Grüße
bastla
Bitte warten ..
Mitglied: mctini
15.01.2009 um 16:36 Uhr
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
Bitte warten ..
Mitglied: bastla
15.01.2009, aktualisiert 18.10.2012
Hallo mctini!

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

Grüße
bastla
Bitte warten ..
Mitglied: mctini
15.01.2009 um 16:43 Uhr
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
Bitte warten ..
Mitglied: mctini
15.01.2009 um 17:01 Uhr
Vielleicht kannst du mir ja noch sagen wie dann nur die ersten 32 Zeile darstelle. Alles was dannach kommt ist uninteressant.
Bitte warten ..
Mitglied: bastla
15.01.2009 um 18:08 Uhr
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:
01.
Anzahl = 31 'Zählung beginnt bei 0 
02.
If UBound(T) < Anzahl Then Anzahl = UBound(T) 'falls es weniger als 32 Zeilen gibt, nimm eben alle 
03.
For i = 0 To Anzahl 
04.
    If Left(T(i), 3) <> "|S|" Then Ausgabe.WriteLine T(i) 'per Index i direkter Zugriff auf die Arrayelemente von T 
05.
Next
Grüße
bastla
Bitte warten ..
Mitglied: mctini
16.01.2009 um 09:04 Uhr
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
Bitte warten ..
Mitglied: bastla
16.01.2009, aktualisiert 14.11.2012
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:
01.
Anzahl = 32 
02.
Geschrieben = 0 
03.
For Each Z In T  
04.
    If Left(Z, 3) <> "|S|" Then 
05.
        If Geschrieben < Anzahl Then 
06.
            Ausgabe.WriteLine Z 
07.
            Geschrieben = Geschrieben + 1 
08.
            'If Geschrieben >= Anzahl Then Exit For 
09.
        End If 
10.
    End If 
11.
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
Bitte warten ..
Mitglied: Turrex0100
16.01.2009 um 19:32 Uhr
@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
Bitte warten ..
Mitglied: suse-5-0
20.01.2009 um 11:51 Uhr
01.
C:\>grep -v "^|S|" csvtest.txt 
02.
XWXX|G|BA 963|Rechner|2009-01-15|07:15||||| 
03.
XWXX|G|BA 963|Rechner|2009-01-15|07:15|||| 
04.
XWXX|G|BA 963|Rechner|2009-01-15|07:15||||| 
05.
|XWXX|G|BA 963|Rechner|2009-01-15|07:15||||| 
06.
XWXX|G|BA 963|Rechner|2009-01-15|07:15||||| 
07.
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/
Bitte warten ..
Mitglied: bastla
20.01.2009 um 14:36 Uhr
@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
Bitte warten ..
Neuester Wissensbeitrag
Windows 10

Powershell 5 BSOD

(3)

Tipp von agowa338 zum Thema Windows 10 ...

Ähnliche Inhalte
Perl
gelöst Mit Perl aus einer Datei teilidentische Zeilen löschen (5)

Frage von Jeduja zum Thema Perl ...

Batch & Shell
Bestimmte Verzeichnisse löschen via Powershell (8)

Frage von killtec zum Thema Batch & Shell ...

VB for Applications
gelöst Bestimmte Spalten aus CSV-Datei auslesen (VBS) (9)

Frage von Gurkenhobel zum Thema VB for Applications ...

Heiß diskutierte Inhalte
LAN, WAN, Wireless
gelöst Server erkennt Client nicht wenn er ausserhalb des DHCP Pools liegt (28)

Frage von Mar-west zum Thema LAN, WAN, Wireless ...

Outlook & Mail
Outlook 2010 findet ost datei nicht (18)

Frage von Floh21 zum Thema Outlook & Mail ...

Windows Server
Server 2008R2 startet nicht mehr (Bad Patch 0xa) (18)

Frage von Haures zum Thema Windows Server ...