VBS - Doppelte Einträge aus Text-Datei bzw. Array löschen
Hallo zusammen,
ich möchte eine Textdatei einlesen und die doppelten Einträge in der Datei löschen.
Leider habe ich nichts einfacheres gefunden als diese Variante hier:
Nur leider scheint das mit diesem Skript nicht so sauber zu laufen wie ich mir das vorstelle..
In der Quelldatei stehen Hunderte von Treibern fast immer mehrfach untereinander drinnen
Hier mal ein paar Beispiele aus der fertigen Datei:
HP LaserJet 4 HP LaserJet 4
Canon iR C2380/2550 Canon iR C2380/2550 PCL5c
HP LaserJet 4000 Ser HP LaserJet 4000 Series PCL
Schön wäre, wenn jeder Treiber nur einmal in der Textdatei stehen würde.
Herausgefunden habe ich schon folgendes: in dem Array strArray (j) stehen die Werte die in die Zieldatei geschrieben werden. Nun müsste man doch einfach dieses Array leeren bevor es die neuen "einzigartigen" Druckertreiber-Werte bekommt. Leider scheiterten meine bisherigen Versuche.
Könnt ihr mir auf die Sprünge helfen ?
Danke schonmal,
Gruß,
Azubi
ich möchte eine Textdatei einlesen und die doppelten Einträge in der Datei löschen.
Leider habe ich nichts einfacheres gefunden als diese Variante hier:
Option Explicit
Dim i
Dim j
Dim fso
Dim flgDouble
Dim objFile
Dim strArray ()
Dim strLine
Dim Abgeschlossen
Dim vbInfo
Set fso = CreateObject ("Scripting.FileSystemObject")
Set objFile = fso.OpenTextFile ("pfadzurquelldatei", 1)
i = 0
ReDim Preserve strArray (0)
Do While Not objFile.AtEndOfStream
flgDouble = False
strLine = objFile.ReadLine
strLine = Left (strLine, 20) & vbTab & Right (strLine, 32)
For j = 0 to i
If StrComp (strArray (j), strLine) = 0 Then flgDouble = True
Next
If Not flgDouble Then
strArray (i) = strLine
i = i + 1
ReDim Preserve strArray (i)
strArray (i) = ""
End If
Loop
objFile.Close
Set objFile = Nothing
Set objFile = fso.CreateTextFile (pfadzurzieldateit", 1)
For j = 0 To UBound (strArray)
If strArray (j) <> "" Then objFile.WriteLine strArray (j)
Next
objFile.Close
Set objFile = Nothing
Set fso = Nothing
MsgBox "Fertig!", Abgeschlossen, vbInfo
Nur leider scheint das mit diesem Skript nicht so sauber zu laufen wie ich mir das vorstelle..
In der Quelldatei stehen Hunderte von Treibern fast immer mehrfach untereinander drinnen
Hier mal ein paar Beispiele aus der fertigen Datei:
HP LaserJet 4 HP LaserJet 4
Canon iR C2380/2550 Canon iR C2380/2550 PCL5c
HP LaserJet 4000 Ser HP LaserJet 4000 Series PCL
Schön wäre, wenn jeder Treiber nur einmal in der Textdatei stehen würde.
Herausgefunden habe ich schon folgendes: in dem Array strArray (j) stehen die Werte die in die Zieldatei geschrieben werden. Nun müsste man doch einfach dieses Array leeren bevor es die neuen "einzigartigen" Druckertreiber-Werte bekommt. Leider scheiterten meine bisherigen Versuche.
Könnt ihr mir auf die Sprünge helfen ?
Danke schonmal,
Gruß,
Azubi
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 155623
Url: https://administrator.de/forum/vbs-doppelte-eintraege-aus-text-datei-bzw-array-loeschen-155623.html
Ausgedruckt am: 23.12.2024 um 17:12 Uhr
3 Kommentare
Neuester Kommentar
Hallo Azubi1452!
Meinst Du mit "doppelten Einträgen", dass genau die selbe Zeile mehrfach vorkommt und daher die Zeile nicht mehr zerlegt werden muss (Zeile 21 spräche allerdings dagegen)?
Unabhängig davon wäre das Mittel meiner Wahl hier ein "Dictionary" (in welches, wenn es tatsächlich um die gesamte Zeile am Stück geht, die jeweilige Zeile, wenn noch nicht vorhanden, als Key einzutragen wäre; das zugehörige "Element" kann beliebig sein, da es ohnehin nur eine "Dummy"-Funktion - im Sinne von "muss eben auch vorhanden sein" - hätte) ...
Im einfachsten Fall (also zeilenweiser Vergleich) sähe das dann so aus:
Grüße
bastla
Meinst Du mit "doppelten Einträgen", dass genau die selbe Zeile mehrfach vorkommt und daher die Zeile nicht mehr zerlegt werden muss (Zeile 21 spräche allerdings dagegen)?
Unabhängig davon wäre das Mittel meiner Wahl hier ein "Dictionary" (in welches, wenn es tatsächlich um die gesamte Zeile am Stück geht, die jeweilige Zeile, wenn noch nicht vorhanden, als Key einzutragen wäre; das zugehörige "Element" kann beliebig sein, da es ohnehin nur eine "Dummy"-Funktion - im Sinne von "muss eben auch vorhanden sein" - hätte) ...
Im einfachsten Fall (also zeilenweiser Vergleich) sähe das dann so aus:
Ein = "D:\Datei.txt"
Aus = "D:\Unikate.txt"
Set fso = CreateObject("Scripting.FileSystemObject")
Set d = CreateObject("Scripting.Dictionary")
ZeilenEin = Split(fso.OpenTextFile(Ein).ReadAll, vbCrLf)
For Each Zeile In ZeilenEin
If Not d.Exists(Zeile) Then d.Add Zeile, Dummy
Next
fso.CreateTextFile(Aus).Write Join(d.Keys, vbCrLf)
bastla
Hallo mike9677!
In diesem Fall müsstest Du einen Zähler mitführen und nur jene Zeilen in die Ausgabedatei schreiben, die genau ein Mal vorgekommen sind - also etwa:
Grüße
bastla
In diesem Fall müsstest Du einen Zähler mitführen und nur jene Zeilen in die Ausgabedatei schreiben, die genau ein Mal vorgekommen sind - also etwa:
Ein = "D:\Datei.txt"
Aus = "D:\Unikate.txt"
Set fso = CreateObject("Scripting.FileSystemObject")
Set d = CreateObject("Scripting.Dictionary")
ZeilenEin = Split(fso.OpenTextFile(Ein).ReadAll, vbCrLf)
For Each Zeile In ZeilenEin
If Not d.Exists(Zeile) Then
d.Add Zeile, 1
Else
d.Item(Zeile) = d.Item(Zeile) + 1
End If
Next
Set AusDatei = fso.CreateTextFile(Aus)
For Each Key In d.Keys
If d.Item(Key) = 1 Then AusDatei.WriteLine Key
Next
AusDatei.Close
bastla