Top-Themen

Aktuelle Themen (A bis Z)

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 - Doppelte Einträge aus Text-Datei bzw. Array löschen

Frage Entwicklung Batch & Shell

Mitglied: Azubi1452

Azubi1452 (Level 1) - Jetzt verbinden

23.11.2010 um 15:41 Uhr, 8127 Aufrufe, 3 Kommentare

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:
01.
Option Explicit 
02.
 
03.
Dim i 
04.
Dim j 
05.
Dim fso 
06.
Dim flgDouble 
07.
Dim objFile 
08.
Dim strArray () 
09.
Dim strLine 
10.
Dim Abgeschlossen 
11.
Dim vbInfo 
12.
 
13.
Set fso = CreateObject ("Scripting.FileSystemObject") 
14.
 
15.
Set objFile = fso.OpenTextFile ("pfadzurquelldatei", 1) 
16.
i = 0 
17.
ReDim Preserve strArray (0) 
18.
Do While Not objFile.AtEndOfStream 
19.
flgDouble = False 
20.
strLine = objFile.ReadLine 
21.
strLine = Left (strLine, 20) & vbTab & Right (strLine, 32) 
22.
For j = 0 to i 
23.
If StrComp (strArray (j), strLine) = 0 Then flgDouble = True 
24.
Next 
25.
If Not flgDouble Then 
26.
strArray (i) = strLine 
27.
i = i + 1 
28.
ReDim Preserve strArray (i) 
29.
strArray (i) = "" 
30.
End If 
31.
Loop 
32.
objFile.Close 
33.
Set objFile = Nothing 
34.
Set objFile = fso.CreateTextFile (pfadzurzieldateit", 1) 
35.
For j = 0 To UBound (strArray) 
36.
If strArray (j) <> "" Then objFile.WriteLine strArray (j) 
37.
Next 
38.
objFile.Close 
39.
Set objFile = Nothing 
40.
Set fso = Nothing 
41.
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
Mitglied: bastla
23.11.2010 um 17:49 Uhr
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:
01.
Ein = "D:\Datei.txt" 
02.
Aus = "D:\Unikate.txt" 
03.
 
04.
Set fso = CreateObject("Scripting.FileSystemObject") 
05.
Set d = CreateObject("Scripting.Dictionary") 
06.
 
07.
ZeilenEin = Split(fso.OpenTextFile(Ein).ReadAll, vbCrLf) 
08.
For Each Zeile In ZeilenEin 
09.
    If Not d.Exists(Zeile) Then d.Add Zeile, Dummy 
10.
Next 
11.
 
12.
fso.CreateTextFile(Aus).Write Join(d.Keys, vbCrLf)
Grüße
bastla
Bitte warten ..
Mitglied: mike9677
15.11.2012 um 11:11 Uhr
Hallo bastla,

ich habe das obige Skript gerade mal probiert.
Wäre es auch möglich, BEIDE doppelten Einträge aus der Text-Datei zu entfernen ?

Bsp: 1.txt

Hilfe 1
Hilfe 2
Hilfe 3
Hilfe 1

In der neuen Text-Datei soll jetzt aber nur folgendes stehen:

neu.txt

Hilfe 2
Hilfe 3

Grüße
mike
Bitte warten ..
Mitglied: bastla
15.11.2012 um 19:39 Uhr
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:
01.
Ein = "D:\Datei.txt" 
02.
Aus = "D:\Unikate.txt" 
03.
 
04.
Set fso = CreateObject("Scripting.FileSystemObject") 
05.
Set d = CreateObject("Scripting.Dictionary") 
06.
 
07.
ZeilenEin = Split(fso.OpenTextFile(Ein).ReadAll, vbCrLf) 
08.
For Each Zeile In ZeilenEin 
09.
    If Not d.Exists(Zeile) Then 
10.
        d.Add Zeile, 1 
11.
    Else 
12.
        d.Item(Zeile) = d.Item(Zeile) + 1 
13.
    End If 
14.
Next 
15.
 
16.
Set AusDatei = fso.CreateTextFile(Aus) 
17.
For Each Key In d.Keys 
18.
    If d.Item(Key) = 1 Then AusDatei.WriteLine Key 
19.
Next 
20.
AusDatei.Close
Grüße
bastla
Bitte warten ..
Ähnliche Inhalte
Batch & Shell
Doppelte Zeilen in Text-Datei löschen
gelöst Frage von reckheimBatch & Shell15 Kommentare

Hallo ich schreibe lange Übersetzungsprogramme in FoxPro in unten folgender Text-Datei-Form. Die Datei ist allerdings durch Zusammenführung verschiedener Versionen ...

Batch & Shell
Batsch doppelte Zeile in in Text finden und eine löschen
Frage von GNLen1Batch & Shell10 Kommentare

Hallo zusammen. Ich habe noch nicht so viel Erfahrung mit batch. Ich will eine Textdatei (oder optional alle Datein ...

Datenbanken
DB doppelte Einträge löschen nur die mit dem älteren Datum (spalte)
gelöst Frage von Jens1985Datenbanken6 Kommentare

Hi, ich habe mal wieder ein Problem. Ich möchte in meiner Datenbank alle doppelten Einträge löschen aber nur die ...

Batch & Shell
Doppelte Eintrage in einer CSV Datei mit PowerShell löschen (Kriterium Aktualität) . Filter
gelöst Frage von RippchenBatch & Shell6 Kommentare

Hallo, ich nutze folgenden Code für mein Problem: Der Code öffnet alle CSV-Dateien in einem Ordner inkl. der Unterordner ...

Neue Wissensbeiträge
Viren und Trojaner

Deaktivierter Keylogger in HP Notebooks entdeckt

Information von bitcoin vor 14 StundenViren und Trojaner1 Kommentar

Ein Grund mehr warum man Vorinstallationen der Hersteller immer blank bügeln sollte Der deaktivierte Keylogger findet sich im vorinstallierten ...

Router & Routing

Lets Encrypt kommt auf die FritzBox

Information von bitcoin vor 17 StundenRouter & Routing

In der neuesten Labor-Version der FB7490 integriert AVM unter anderem einen Let's Encrypt Client für Zugriffe auf das Webinterface ...

Internet

Was nützt HTTPS, wenn es auch von Phishing Web-Seiten genutzt wird

Information von Penny.Cilin vor 3 TagenInternet17 Kommentare

HTTPS richtig einschätzen Ob man eine Webseite via HTTPS aufruft, zeigt ein Schloss neben der Adresse im Webbrowser an. ...

Webbrowser

Bugfix für Firefox Quantum released - Installation erfolgt teilweise nicht automatisch!

Erfahrungsbericht von Volchy vor 4 TagenWebbrowser8 Kommentare

Hallo zusammen, gem. dem Artike von heise online wurde mit VersionFirefox 57.0.1 sicherheitsrelevante Bugs behoben. Entgegen der aktuellen Veröffentlichung ...

Heiß diskutierte Inhalte
Batch & Shell
Trusted Sites für alle User auf dem PC einpflegen
Frage von xXTaKuZaXxBatch & Shell12 Kommentare

Aufgabestellung: Es sollen auf 1 PC (bzw. mehreren PCs) vertrauenswürdige Sites per Powershell eingetragen werden, die für alle User ...

Voice over IP
Telefonstörung - Ortsrufnummern kein Verbindungsaufbau
Frage von Windows10GegnerVoice over IP10 Kommentare

Hallo, sowohl bei uns als auch beim Opa ist es über VoIP nicht möglich Ortsrufnummern anzurufen. Es kommt nach ...

Vmware
DOS 6.22 in VMWare mit CD-ROM
gelöst Frage von hesperVmware10 Kommentare

Hallo zusammen! Ich hab ein saublödes Problem. Es ist eine VMWare mit DOS 6.22 zu erstellen auf dem ein ...

Cloud-Dienste
PIM als SaaS Nutzungsgebühr
Frage von vanTastCloud-Dienste8 Kommentare

Moin, wir haben uns ein PIM (Product Information Management) nach unseren Ansprüchen für viel Geld als SaaS-Lösung bauen lassen. ...