Hi…
Hab da mal was programmiert…
Als erstes erstellst du eine neue Windows Anwendung.
In dem Form1 erstellst du drei Textfelder.
- TextBox1 ist für die Quelldatei
- TextBox2 ist für die Ausschlussdatei
- TextBox3 ist für die Zieldatei
Dann erstellst du neben jeder TextBox jeweils einen Button.
- Button1 zum öffnen der Quelldatei
- Button2 zum öffnen der Ausschlussdatei
- Button3 zum öffnen der Zieldatei
Danach erstellst du direkt drunter noch einen großen Button.
- Button4 zum starten des Prozesses
Als nächstes erstellst du unter dem großen Button noch einen Progressbalken.
- ProgressBar1 zum anzeigen des aktuellen Fortschritts des Prozesses
Zum Schluss brauchst du den OpenFileDialog und SaveFileDialog. Diese ziehst du ebenso in das Form und erscheinen dann am unteren Rand des Projekts.
- OpenFileDialog1 zum öffnen von Dateien
- SaveFileDialog1 zum speichern von Dateien
Wenn du alles in deinem Form drin hast, klickst du doppelt irgendwas an (z.B. doppelt klicken auf einen der Button).
Es erscheint der Texteditor mit ein bisschen Code drin.
Lösche alles raus und füge den nachfolgenden Code hinein.
Danach musst du noch die Dateien vorbereiten. Das steht aber unterhalb von dem beigefügten Code.
Imports System.IO
Public Class Form1
Private Sub Button1\_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
' ----- Quelldatei öffnen -----
With OpenFileDialog1
.Title = "Quelldatei öffnen"
.Filter = "Alle Dateiei (\*.\*)|\*.\*"
.InitialDirectory = My.Computer.FileSystem.SpecialDirectories.MyDocuments
.Multiselect = False
.FileName = ""
.ShowDialog()
If .FileName "" Then TextBox1.Text = .FileName
End With
End Sub
Private Sub Button2\_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
' ----- Ausschlussdatei öffnen -----
With OpenFileDialog1
.Title = "Ausschlussdatei öffnen"
.Filter = "Alle Dateiei (\*.\*)|\*.\*"
.InitialDirectory = My.Computer.FileSystem.SpecialDirectories.MyDocuments
.Multiselect = False
.FileName = ""
.ShowDialog()
If .FileName "" Then TextBox2.Text = .FileName
End With
End Sub
Private Sub Button3\_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
' ----- Zieldatei speichern -----
With SaveFileDialog1
.Title = "Zieldatei speichern"
.Filter = "Alle Dateiei (\*.\*)|\*.\*"
.InitialDirectory = My.Computer.FileSystem.SpecialDirectories.MyDocuments
.FileName = ""
.ShowDialog()
If .FileName "" Then TextBox3.Text = .FileName
End With
End Sub
Private Sub Button4\_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click
' ----- Datei auslesen, vergleichen und abspeichern -----
' -------------------------------------------------------
' ----- Vorbereitungen -----
' Hier werden Variablen für die nachstehende Verarbeitung festgelegt.
' Danach wird das Hautfenster des Programms disabled und noch einmal aktualisiert.
' Der Progressbalken wird auf 0 gesetzt falls zuvor bereits eine Verarbeitung stattfand.
Dim Ausschlussdatei\_Dateiinhalt As String = ""
Dim Quelldatei\_ZeilenweiserDateiinhalt As String = ""
Dim Quelldatei\_Dateigroesse As Integer = FileLen(TextBox1.Text)
Dim FileStreamR As StreamReader
Dim FileStreamW As StreamWriter
Dim Zaehler\_DatensaetzeAlle As Integer = 0
Dim Zaehler\_DatensaetzeOK As Integer = 0
Dim Zaehler\_DatensaetzeNOK As Integer = 0
Dim InfoText As String = ""
Me.Enabled = False
Me.Refresh()
ProgressBar1.Value = 0
' ----- Ausschlussdatei auslesen und in einer Variable zwischenspeichern -----
' Hier wird der StreamReader mit der Ausschlussdatei initialisiert.
' Anschließend wird der gesamte Dateiinhalt in die entsprechende Variable gelesen.
' Danach wird der StreamReader wieder geschlossen.
FileStreamR = New StreamReader(TextBox2.Text)
Ausschlussdatei\_Dateiinhalt = FileStreamR.ReadToEnd
FileStreamR.Close()
' ----- Quelldatei zeilenweise auslesen und mit der Ausschluss-Variable vergleichen -----
' Hier werden der StreamReader und StreamWriter mit den jeweiligen Dateien initialisiert.
' Danach wird solange die Quelldatei zeilenweise gelesen, bis PEEK kein Zeichen mehr zurückgibt.
' In der zwischenzeit wird der Progressbalken immer wieder aktualisiert und die jeweils gelesene
' Zeile in die entsprechende Variable gespeichert.
' Die Variable wird mit dem Inhalt der Ausschlussdatei verglichen und entsprechend wird die
' Zeile ignoriert oder in die vorgesehene Zieldatei gespeichert.
' Zählervariablen geben im Abschluss die Anzahl der verarbeiteten Datensätze zurück.
' Danach werden der StreamReader und der StreamWriter wieder geschlossen.
FileStreamR = New StreamReader(TextBox1.Text)
FileStreamW = New StreamWriter(TextBox3.Text)
While FileStreamR.Peek() \> -1
ProgressBar1.Value = (99 / Quelldatei\_Dateigroesse) \* FileStreamR.BaseStream.Position
Quelldatei\_ZeilenweiserDateiinhalt = FileStreamR.ReadLine
Zaehler\_DatensaetzeAlle += 1
If InStr(Ausschlussdatei\_Dateiinhalt, Quelldatei\_ZeilenweiserDateiinhalt) = 0 Then
Zaehler\_DatensaetzeOK += 1
FileStreamW.WriteLine(Quelldatei\_ZeilenweiserDateiinhalt)
Else
Zaehler\_DatensaetzeNOK += 1
End If
End While
FileStreamR.Close()
FileStreamW.Close()
' ----- Abschluss -----
' Hier wird das Hauptfenster wieder enabled und der Text für die anschließende
' Messagebox vorbereitet.
' Danach wird der Text am Bildschirm angezeigt.
Me.Enabled = True
InfoText = "Prozess abgeschlossen" & vbCrLf & vbCrLf
InfoText &= "Datensätze gesamt: " & CStr(Zaehler\_DatensaetzeAlle) & vbCrLf
InfoText &= "Datensätze gespeichert: " & CStr(Zaehler\_DatensaetzeOK) & vbCrLf
InfoText &= "Datensätze gelöscht: " & CStr(Zaehler\_DatensaetzeNOK)
MsgBox(InfoText, MsgBoxStyle.Information)
End Sub
End Class
Also in der Quelldatei habe ich die folgenden beiden Zeilen hergenommen und immer wieder kopiert bis ich irgendwann mal ca. 67.000 Datensätze zusammen hatte.
INSERT INTO gameobject_spawns VALUES (‚99863‘, ‚300147‘, ‚0‘, ‚1‘, ‚1‘, ‚-43.4367‘, ‚-923.198‘, ‚55.8714‘, ‚5.75401‘, ‚0‘, ‚0‘, ‚0.261511‘, ‚-0.965201‘, ‚25‘, ‚0‘, ‚1‘);
INSERT INTO gameobject_spawns VALUES (‚30054‘, ‚2030‘, ‚0‘, ‚1‘, ‚1‘, ‚758.712‘, ‚-1467.83‘, ‚78.6684‘, ‚1.4399‘, ‚0‘, ‚0‘, ‚0.659346‘, ‚0.75184‘, ‚7200‘, ‚100‘, ‚1‘);
Für die Ausschlussdatei habe ich die folgenden Zeilen genommen. Wobei die erste Zeile ca. 100 mal in der Datei stand und die zweite Zeile nur einmal mitten in der Datei zu finden war. Quasi um zu testen ob der Datensatz mitten in der Datei auch zu finden ist. Die restlichen 100 Datensätze sind nur pseudo…
INSERT INTO gameobject_spawns VALUES (‚0‘, ‚0‘, ‚0‘, ‚0‘, ‚0‘, ‚0‘, ‚0‘, ‚0‘, ‚0‘, ‚0‘, ‚0‘, ‚0‘, ‚0‘, ‚0‘, ‚0‘, ‚0‘);
INSERT INTO gameobject_spawns VALUES (‚99863‘, ‚300147‘, ‚0‘, ‚1‘, ‚1‘, ‚-43.4367‘, ‚-923.198‘, ‚55.8714‘, ‚5.75401‘, ‚0‘, ‚0‘, ‚0.261511‘, ‚-0.965201‘, ‚25‘, ‚0‘, ‚1‘);
Die Zieldatei erstellt das Programm sowieso selbst. Die brauchst du nicht vorbereiten…
So zum Programm selbst. Wenn du das Programm startest, bekommst du das Fenster mit den Textboxen und den Button angezeigt.
Wenn du nun auf jeweils einen der Button neben den Textboxen klickst, erscheint der Öffnen-Dialog um jeweils die Quell- und Ausschlussdatei zu öffnen. Der dritte Button ist für die Zieldatei. Diese braucht aber nicht vorhanden sein da es der Speicher-Dialog ist und das Programm eh die Datei neu erstellt. Achte aber darauf die in den drei Textboxen die genaue Pfadangabe und Dateiname vorhanden ist.
Zum Schluss dann nur noch auf den großen Button klicken und abwarten bis eine Textmeldung erscheint…
MfG,
Thomas
PS: Von den Test-Dateien immer Sicherheitskopien anlegen um ggf. diese Dateien wieder austauschen zu können. Bitte keine anderen Dateien außer den Test-Dateien benutzen. Andere Dateien können durch das Programm beschädigt werden und sind anschließend ggf. nicht mehr brauchbar…