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-Entfernen von Zeilen in einer Textdatei

Frage Entwicklung VB for Applications

Mitglied: Calim3ro

Calim3ro (Level 1) - Jetzt verbinden

06.04.2014 um 01:20 Uhr, 1878 Aufrufe, 5 Kommentare

Hallo zusammen

Ich möchte aus einer Textdatei Zeilen entfernen. Ich habe drei Dateien, in Datei "A" stehen Wörter, in Datei "B" sind Zahlen und Wörter enthalten, in Datei "C" sind Zahlen.

Beispiele:

Datei "A"

Bus
Auto
...

Datei "B"

1234567 Bus
2345678 Motorrad
3456789 Auto
4567890 Fahrrad
...

Datei "C"

AA 1234567
BB 1234567
AA 2345678
BB 2345678
AA 3456789
AA 4567890
...

Wie müsste ein Skript aussehen, das die Datei "A" einliest, in der Datei "B" nach dem entsprechenden Wort sucht, die Zahl vor dem entsprechenden Wort merken, in Datei "C" nach der Zahl suchen und diese Zeile löschen, jedoch nur wenn AA vorneweg steht? (die Zahl kann auch in einem anderen Zusammenhang in Datei "C" vorkommen und sollte nicht entfernt werden.)

Bin für jeden Lösungsansatz oder Input dankbar.

Bei Unklarheiten bitte nachfragen.

Gruss Calimero
Mitglied: 115420
06.04.2014, aktualisiert um 22:30 Uhr
Hallo Calimero!

Könnte hiermit funktionieren:
01.
Option Explicit 
02.
 
03.
Const FileA = "E:\Test\DateiA.txt"	'Pfade anpassen 
04.
Const FileB = "E:\Test\DateiB.txt" 
05.
Const FileC = "E:\Test\DateiC.txt" 
06.
 
07.
Dim oFso, oRe, oMatch, aTextA, sTextA, sTextB, sTextC, sNumber 
08.
     
09.
Set oRe = New RegExp 
10.
Set oFso = CreateObject("Scripting.FileSystemObject") 
11.
     
12.
aTextA = Split(oFso.OpenTextFile(FileA).ReadAll, vbNewLine) 
13.
sTextB = oFso.OpenTextFile(FileB).ReadAll 
14.
sTextC = oFso.OpenTextFile(FileC).ReadAll 
15.
     
16.
With oRe 
17.
   .Global = False 
18.
   .IgnoreCase = False 
19.
         
20.
    For Each sTextA In aTextA 
21.
        If Trim(sTextA) <> "" Then 
22.
           .Pattern = "(\d+)\s+" & sTextA 
23.
                 
24.
            Set oMatch = .Execute(sTextB) 
25.
                 
26.
            If oMatch.Count Then 
27.
                sNumber = oMatch(0).SubMatches(0) 
28.
               .Pattern = "AA\s+" & sNumber & "\r?\n?" 
29.
                     
30.
                Set oMatch = .Execute(sTextC) 
31.
                     
32.
                If oMatch.Count Then 
33.
                    sTextC = Replace(sTextC, oMatch(0).Value, "") 
34.
                End If 
35.
            End If 
36.
        End If 
37.
    Next 
38.
End With 
39.
 
40.
oFso.CreateTextFile(FileC).Write sTextC 
41.
 
42.
MsgBox "Habe Fertig!"
Grüße

Der Ratsuchende
Bitte warten ..
Mitglied: Calim3ro
06.04.2014 um 22:13 Uhr
Hallo Ratsuchender (eigentlich bin ja ich das )

Besten Dank für dein Skript, habe die Pfade entsprechend angepasst.

Jedoch gibt mit Windows Script Host einen Fehler aus. (Variable sTextB nicht definiert)

Habe nach kurzen Recherche im I-Net das "Option Explicit" und "Const" entfernt, nun motzt Windows Script Host nicht mehr.

Dafür hängt sich nach einiger Zeit der Windows Script Host auf. (Windows Based Script Host funktioniert nicht mehr)

Kann das mit der Grösse von Datei C zusammenhängen? (1.5 GB gross)

Kann man das Skript so umschreiben, dass bereits geprüfte Zeilen in ein anderes File geschrieben werden (Datei D) und die, welche dem Kriterium aus Datei A entsprechen, nicht?

Könnte dies das Problem mit Windows Script Host beheben?

Besten Dank für deine Bemühungen.

Grüsse Calimero
Bitte warten ..
Mitglied: Xaero1982
06.04.2014, aktualisiert um 22:51 Uhr
Komisch, denn sTextB ist ganz klar definiert in der

01.
dim oFso, oRe, oMatch, aTextA, sTextA, sTextB, sTextC, sNumber 
Zeile. Und Const sollte hier auch nicht das Problem sein bei Option Explicit.

Sorry, aber EINE Textdatei mit einer Größe von 1,5 GB? Die kann man eigentlich nur noch in die Tonne treten. Ich wüsste nicht welches Programm das öffnen soll.

Du solltest zunächst mal versuchen die Datei C zu verkleinern via script in dem du sie Zeilenweise einliest und ka 100 Zeilen oder so in eine neue Textdatei schreibst - von mir aus auch 1000 oder so.

Gruß
ps: Wenn das mit dem splitten nicht geht könntest du versuchen alle drei Dateien in eine Datenbank zu schreiben und dort diesen Vergleich mit einer Abfrage durchzuführen.
Bitte warten ..
Mitglied: bastla
06.04.2014, aktualisiert um 23:52 Uhr
Hallo Calim3ro!

Unter der Annahme, dass die Zahlen in DateiB immer gleich lang sind (in Deinem Beispiel 7 Stellen - siehe Zeile 9), könnte das auf Basis des Ansatzes von DerRatsuchende etwa so gehen:
01.
Option Explicit 
02.
 
03.
Const FileA = "E:\Test\DateiA.txt"	'Pfade anpassen 
04.
Const FileB = "E:\Test\DateiB.txt" 
05.
Const FileC = "E:\Test\DateiC.txt" 
06.
Const FileN = "E:\Test\DateiNeu.txt" 
07.
 
08.
Const Prefix = "AA " 
09.
Const LenNumber = 7 
10.
 
11.
Dim oFso, oRe, oMatch, aTextA, sTextA, sTextB, sNumber, oDict, sKey, iLenPre, iLenKey, oFileC, oFileN, sLine 
12.
     
13.
Set oRe = New RegExp 
14.
Set oFso = CreateObject("Scripting.FileSystemObject") 
15.
Set oDict = CreateObject("Scripting.Dictionary") 
16.
 
17.
iLenPre = Len(Prefix) 
18.
iLenKey = iLenPre + LenNumber 
19.
     
20.
aTextA = Split(oFso.OpenTextFile(FileA).ReadAll, vbNewLine) 
21.
sTextB = oFso.OpenTextFile(FileB).ReadAll 
22.
     
23.
With oRe 
24.
   .Global = False 
25.
   .IgnoreCase = False 
26.
         
27.
    For Each sTextA In aTextA 
28.
        If Trim(sTextA) <> "" Then 
29.
           .Pattern = "(\d+)\s+" & sTextA 
30.
                 
31.
            Set oMatch = .Execute(sTextB) 
32.
                 
33.
            If oMatch.Count Then 
34.
                sNumber = oMatch(0).SubMatches(0) 
35.
                sKey = Prefix & sNumber 
36.
                If Not oDict.Exists(sKey) Then oDict.Add sKey, sTextA 
37.
            End If 
38.
        End If 
39.
    Next 
40.
End With 
41.
 
42.
Set oFileC = oFso.OpenTextFile(FileC) 
43.
Set oFileN = oFso.CreateTextFile(FileN) 
44.
Do While Not oFileC.AtEndOfStream 
45.
    sLine = oFileC.ReadLine 
46.
    If Left(sLine, iLenPre) = Prefix Then 
47.
        sKey = Left(sLine, iLenKey) 
48.
        If Not oDict.Exists(sKey) Then oFileN.WriteLine sLine 
49.
    Else 
50.
        oFileN.WriteLine sLine 
51.
    End If     
52.
Loop 
53.
MsgBox "Habe Fertig!"
Es wird hier eine neue Datei erzeugt, die nur noch die gewünschten Zeilen enthält. Da die DateiC nicht komplett in den Arbeitsspeicher eingelesen wird, sollte die Dateigröße kein Problem sein ...

Ob das Prüfen der Zeilen aus DateiC auf den Zeilenanfang "AA " und erst bei Übereinstimmung der Vergleich der Nummer Performancevorteile bringt, müsstest Du selbst testen - das Script sähe alternativ so aus:
01.
Option Explicit 
02.
 
03.
Const FileA = "E:\Test\DateiA.txt"	'Pfade anpassen 
04.
Const FileB = "E:\Test\DateiB.txt" 
05.
Const FileC = "E:\Test\DateiC.txt" 
06.
Const FileN = "E:\Test\DateiNeu.txt" 
07.
 
08.
Const Prefix = "AA " 
09.
Const LenNumber = 7 
10.
 
11.
Dim oFso, oRe, oMatch, aTextA, sTextA, sTextB, sNumber, oDict, sKey, iLenPre, iLenKey, oFileC, oFileN, sLine 
12.
     
13.
Set oRe = New RegExp 
14.
Set oFso = CreateObject("Scripting.FileSystemObject") 
15.
Set oDict = CreateObject("Scripting.Dictionary") 
16.
 
17.
iLenPre = Len(Prefix) 
18.
iLenKey = iLenPre + LenNumber 
19.
     
20.
aTextA = Split(oFso.OpenTextFile(FileA).ReadAll, vbNewLine) 
21.
sTextB = oFso.OpenTextFile(FileB).ReadAll 
22.
     
23.
With oRe 
24.
   .Global = False 
25.
   .IgnoreCase = False 
26.
         
27.
    For Each sTextA In aTextA 
28.
        If Trim(sTextA) <> "" Then 
29.
           .Pattern = "(\d+)\s+" & sTextA 
30.
                 
31.
            Set oMatch = .Execute(sTextB) 
32.
                 
33.
            If oMatch.Count Then 
34.
                sNumber = oMatch(0).SubMatches(0) 
35.
                sKey = Prefix & sNumber 
36.
                If Not oDict.Exists(sKey) Then oDict.Add sKey, sTextA 
37.
            End If 
38.
        End If 
39.
    Next 
40.
End With 
41.
 
42.
Set oFileC = oFso.OpenTextFile(FileC) 
43.
Set oFileN = oFso.CreateTextFile(FileN) 
44.
Do While Not oFileC.AtEndOfStream 
45.
    sLine = oFileC.ReadLine 
46.
    sKey = Left(sLine, iLenKey) 
47.
    If Not oDict.Exists(sKey) Then oFileN.WriteLine sLine 
48.
Loop 
49.
MsgBox "Habe Fertig!"
Grüße
bastla
Bitte warten ..
Mitglied: 115420
07.04.2014, aktualisiert um 12:22 Uhr
Guten Morgen!

Komisch, denn sTextB ist ganz klar definiert in der
Sorry, war es nicht (*erwischt*)

Hatte gestern Abend bevor ich in's Bett ging, in der Dim-Zeile noch schnell ein abhanden gekommenes Komma eingefügt und wollte es auch kommentieren, hab's dann aber erstmal sein lassen, weil mir zu den 1,5 GB nix eingefallen war, zumal ich gedanklich schon im Bett war

bastlas Lösungsvorschläge finde ich gut Wie es mit der Perfomance aussieht ist allerdings eine andere Frage?


Grüße

spatzenhirn (DerRatsuchende)
Bitte warten ..
Neuester Wissensbeitrag
Windows 10

Powershell 5 BSOD

(8)

Tipp von agowa338 zum Thema Windows 10 ...

Heiß diskutierte Inhalte
Microsoft
Ordner mit LW-Buchstaben versehen und benennen (21)

Frage von Xaero1982 zum Thema Microsoft ...

Windows Update
Treiberinstallation durch Windows Update läßt sich nicht verhindern (17)

Frage von liquidbase zum Thema Windows Update ...

Windows Tools
gelöst Aussendienst Datensynchronisierung (12)

Frage von lighningcrow zum Thema Windows Tools ...

Windows Server
RODC über VPN - Verbindung weg (10)

Frage von stefan2k1 zum Thema Windows Server ...