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

VBS Zeilen in Textfile suchen und nur nach erfüllten Kriterien löschen

Frage Entwicklung VB for Applications

Mitglied: Calim3ro

Calim3ro (Level 1) - Jetzt verbinden

19.03.2014 um 21:44 Uhr, 2052 Aufrufe, 6 Kommentare

Hallo zusammen

Ich gelange wieder mal mit einer Bitte an euch.

Kurze Erläuterung:

In einem File habe ich Zeichenböcke:

11 ABCDEF
22 CDEFGH
33 DEFGHI
44 BCDEFG
11 FEDCBA
22 HGFEDC
33 IHGFED
44 GHIFED
.....

Ein Zeichenblock beginnt immer mit 11.
Nun soll als erste Kritik geprüft werden, ob bei 22 in Spalte 4 ein X enthält. Wenn Ergebniss negativ (kein X), weiter mit Kritik zwei. Zweite Kritik, ob bei Zeile 33 in Spalte 4 ein D enthält. Wenn positiv (D vorhanden) weiter mit Kritik drei. Dritte Kritik, ob bei Zeile 44 in Spalte 4 ein B (oder andere/ mehrere gemäss separater Liste) enthalten ist. Da es für Kritik drei mehrere Buchstaben-Möglichkeiten gibt und die einfach zu ändern sein sollten, wäre es super wenn dies über eine Positiv-Liste geschehen würde.

Wenn alle Kriterien erfüllt wurden, muss Zeile 44 gelöscht werden. Falls Kritik eins positiv, muss nichts gelöscht werden, ebenso wie wenn Kritik zwei und drei negativ sind.

Am Ende sollte der Zeichenblock folgendermassen aussehen:

11 ABCDEF
22 CDEFGH
33 DEFGHI
11 FEDCBA
22 HGFEDC
33 IHGFED
44 GHIFED

Wie müsste ein VB-Script aussehen, das nach dieser Logik folgt?

Besten Dank im Voraus für euere Bemühungen.

Bei Unklarheiten einfach nachfragen, die Beschreibung war nicht ganz leicht zu formulieren....

Grüsse Calimero

Mitglied: bastla
19.03.2014, aktualisiert um 23:58 Uhr
Hallo Calim3ro!

Versuch es damit:
01.
Kenn = Array("11", "22", "33", "44") 'Kennzeichen Zeilenbeginn 
02.
KPos = Array(0, 4, 4, 4)             'zu untersuchende Position in Zeile 
03.
Krit = Array("", "X", "D", "BCFKN")  'Kriterien für die einzelnen Kennungen; Positivliste für "44" = "BCFKN" 
04.
'Kriterium 1 = 1 (egal, wird nicht geprüft; nur damit gleich viele Elemente wie oben) 
05.
'Kriterium 2 = 0 (keine Übereinstimmung) 
06.
'Kriterium 3 = 1 (Übereinstimmung) 
07.
'Kriterium 4 = 1 (Übereinstimmung) 
08.
K = Array(1, 0, 1, 1) 
09.
 
10.
Ein = "File.txt" 
11.
Aus = "File_neu.txt" 
12.
 
13.
KLen = Len(Kenn(0)) 'Länge der Zeilenkennung ermitteln 
14.
KAnz = UBound(Kenn) 'Anzahl der Kriterien ermitteln 
15.
 
16.
Set fso = CreateObject("Scripting.FileSystemObject") 
17.
Set E = fso.OpenTextFile(Ein) 
18.
Set A = fso.CreateTextFile(Aus) 
19.
 
20.
Do While Not E.AtEndOfStream 'alle Zeilen durchgehen 
21.
    Z = E.ReadLine 'Zeile einlesen 
22.
    If Left(Z, KLen) = Kenn(0) Then 'Blockbeginn? 
23.
        'KriterienEregebnis auf "erfüllt" setzen 
24.
        KErg = 1 
25.
        A.WriteLine Z 'Zeile jedenfalls schreiben 
26.
    Else ' ... ansonsten 
27.
        For i = 1 To KAnz 'auf Kriterien ab 2 (Index beginnt bei 0, daher Schleife ab 1) prüfen 
28.
            If Left(Z, KLen) = Kenn(i) Then 'Kennung gefunden 
29.
                'Wenn Zeichen in Kriterienliste gefunden, 
30.
                'Übereinstimmung / keine Übereinstimmung prüfen: 
31.
                P = InStr(Krit(i), Mid(Z, KPos(i), 1)) 'Zeichenposition; wenn nicht gefunden: 0 
32.
                'Sgn(P) liefert 1 bei "Übereinstimmung" und 0 bei "keine Übereinstimmung" 
33.
                'dieses Ergebnis mit der Vorgabe in K() vergleichen und 
34.
                'KriterienErgebnis durch UND-Verknüpfung (Multiplikation) ermitteln 
35.
                KErg = KErg * (Sgn(P) = K(i)) 
36.
                KritNr = i 'Kriteriennummer zwischenspeichern 
37.
            End If 
38.
        Next 
39.
        If KritNr <> KAnz Then 'noch nicht letzte Kennung, ... 
40.
            A.WriteLine Z '... daher Zeile jedenfalls schreiben 
41.
        Else 'letzte Kennung (= "44") ... 
42.
           If KErg = 0 Then A.WriteLine Z '... daher nur schreiben, wenn nicht alle Kriterien erfüllt 
43.
        End If 
44.
    End If 
45.
Loop
Bitte beachten: Beim Vergleich mit den Zeichen in Krit() wird Groß-/Kleinschreibung berücksichtigt!

Grüße
bastla
Bitte warten ..
Mitglied: TsukiSan
20.03.2014, aktualisiert um 08:35 Uhr
Hallo bastla,

nur so unter Kollegen: Meine paar Zeilen würden den Anforderungen auch genüge tun, allerdings hätte ich dazu gern deinen Kommentar, falls das möglich ist.

Hallo Calim3ro,

nur als Alternative. Bastla hat Kommentare dazu geschrieben. Die erspare ich mir, weil bastlas Zeilen genau das tun, was du möchtest.

01.
Const DateiEin = "DateiEin.txt" 
02.
Const DateiAus = "DateiAus.txt" 
03.
Const BlockTrenner = "11" 
04.
KritArray = Array("","X","D","B") 
05.
Dim DatenNeu 
06.
 
07.
Set FSO = CreateObject("Scripting.FileSystemObject") 
08.
Bloecke = Split(FSO.OpenTextFile(DateiEin).ReadAll,BlockTrenner) 
09.
 
10.
For i = 0 to Ubound(Bloecke) 
11.
	If Not Bloecke(i) = "" then 
12.
		TempFailed = 0 
13.
		tempZeilen = Split(Bloecke(i),vbcrlf) 
14.
		If Mid(tempZeilen(1),4,1) = KritArray(1) then 
15.
			TempFailed = 1 
16.
		End If 
17.
		For j = 2 to 3 
18.
			If Mid(tempZeilen(j),4,1) = KritArray(j) Or TempFailed = 1 then 
19.
				'hier passiert nichts! 
20.
			Else 
21.
				TempFailed = 1 
22.
				Exit For 
23.
			End If 
24.
		next 
25.
		If TempFailed = 1 then 
26.
			DatenNeu = DatenNeu & BlockTrenner & Bloecke(i) 
27.
		Else 
28.
			tempZeilen(0) = BlockTrenner & tempZeilen(0) 
29.
			For k = 0 to 2 
30.
				temp = temp & tempZeilen(k) & vbcrlf 
31.
			Next 
32.
			DatenNeu = DatenNeu & temp 
33.
			temp = "" 
34.
		End If 
35.
	End If 
36.
Next 
37.
 
38.
DatenAus = FSO.CreateTextFile(DateiAus,True).Write (DatenNeu)  
39.
 
40.
Set FSO = Nothing 
41.
Set DatenAus = Nothing
Gruss

Tsuki

[Edit]
Code entsprechend angepasst, dass
NICHT X, D, B
und beide unnützen Zeilen 15 und 16 entfernt
[/Edit]
Bitte warten ..
Mitglied: bastla
20.03.2014 um 08:14 Uhr
Hallo Tsuki!

Habe Deinen Ansatz nur kurz überflogen, wobei mir aufgefallen ist, dass Du die Variablen aus den Zeilen 15 und 16 gar nicht verwendest und anscheinend alle Überprüfungen auf "Übereinstimmung" vornimmst - für die "22"-Zeilen soll aber gelten, dass "X" <i>nicht<i> vorkommen darf; ansonsten durchaus sinnvoll und nachvollziehbar ...

Da ich zusammen mit Callim3ro schon in einem anderen Thread eine ähnliche Struktur bearbeitet hatte und dort nachträglich noch diverse Änderungen nötig wurden, habe ich in meinem Ansatz gleich etwas vorgesorgt und stärker parametrisiert ...

Grüße
bastla
Bitte warten ..
Mitglied: TsukiSan
20.03.2014 um 08:19 Uhr
Hallo bastla,

besten Dank für dein Feedback.
Richtig, Zeilen 15 und 16 sind "nutzlos" und dienten nur als Test.
Und auch richtig, dass das X negiert werden muss. Hatte ich beim Lesen der Aufgabe
nicht richtig beachtet. Liese sich aber ändern.

Viele Grüsse

Tsuki
Bitte warten ..
Mitglied: Calim3ro
23.03.2014 um 23:56 Uhr
Hallo TsukiSan

Besten Dank das du dir auch noch Gedanken über die Script-findung gemacht hast, aus den von bastlas erwähnten Gründen verwende ich jedoch seinen.

Hallo bastla

Irgendwie wusste ich, dass ich von dir als erstes eine Lösung erhalte.
Besten Dank, das Script mach genau das was ich geschrieben habe. Jedoch hat meine Beschreibung einen Fehler: Es sollte Zeile 33 löschen, nicht 44
Sorry, war ein Überlegungsfehler...

Ist es ausserdem möglich für Kritik 4 eine .txt-Liste in das Script zu lesen, ähnlich der Positivliste aus dem letzten Script?

Besten Dank schon mal im Voraus

Grüsse Calimero
Bitte warten ..
Mitglied: bastla
24.03.2014, aktualisiert um 20:06 Uhr
Hallo Calim3ro!

Für die neue Variante bräuchte ich vorweg eine Bestätigung: Besteht jeder Block tatsächlich aus genau 4 Zeilen, die mit "11", "22", "33" und "44" beginnen und auch entsprechend sortiert sind?

Hinsichtlich der Positivliste: Wenn die benötigten Werte alle ohne Trennzeichen in der ersten (einzigen) Zeile der Datei "D:\Positivliste.txt" stehen, kannst Du Zeile 3 durch
01.
Set fso = CreateObject("Scripting.FileSystemObject") 
02.
K4 = fso.OpenTextFile("D:\Positivliste.txt").ReadLine 
03.
Krit = Array("", "X", "D", K4)  'Kriterien für die einzelnen Kennungen
ersetzen und Zeile 16 weglassen ...

Grüße
bastla
Bitte warten ..
Neuester Wissensbeitrag
Heiß diskutierte Inhalte
Windows Userverwaltung
Ausgeschiedene Mitarbeiter im Unternehmen - was tun mit den AD Konten? (33)

Frage von patz223 zum Thema Windows Userverwaltung ...

LAN, WAN, Wireless
FritzBox, zwei Server, verschiedene Netze (21)

Frage von DavidGl zum Thema LAN, WAN, Wireless ...

Viren und Trojaner
Aufgepasst: Neue Ransomware Goldeneye verbreitet sich rasant (20)

Link von Penny.Cilin zum Thema Viren und Trojaner ...

Windows Netzwerk
Windows 10 RDP geht nicht (18)

Frage von Fiasko zum Thema Windows Netzwerk ...