#1 4. November 2010 Zuletzt von einem Moderator bearbeitet: 14. April 2017 Scan Result Filter Filtert Scan Results aus einer Txt Datei nach Up und Downloadspeed. Programmiersprache: VB.Net Framework: 3.5 Läuft auf 64bit und 32bit Man hat die Möglichkeit ein Minimum für dl und uploadspeed einzutragen. d.h. es werden alle Server welche einen geringeren Speed erreicht haben raus genommen und der Rest in eine neue txt Datei geschrieben. Die Source Datei muss so ein Format haben (weiß leider nicht mit welchen Scanner das gemacht wurde) {img-src: http://img526.imageshack.us/img526/4126/outyo.jpg} Hier die Oberfläche vom Programm: {bild-down: http://img525.imageshack.us/img525/3577/resultey.jpg} Ich geh hier nur auf die wichtigsten Teile vom Quellcode ein, das Komplette Projekt kann dann unten als .zip runtergeladen werden. Wie gesagt, ich bin noch Anfänger deswegen hab ich das Programm damit geschrieben was ich bereits kann, an einigen stellen ist es bestimmt "umständlicher" oder nicht schön geschrieben, für Verbesserungsvorschläge bin ich daher gerne offen, will ja auch was lernen Nach einigen Error Handlings + Überprüfungen ob als speed bei beiden Feldern nur 0.00 eingegeben wurde (und der Überprüfung ob es davon überhaupt welche gibt) gehts los. Zuerst lese ich die Zeilen aus der txt Datei in ein List(of String) Code: Dim Lines As New List(Of String) ein, dazu habe ich noch die Abfrage ob die Datei mit Decimal stellen oder ohne überprüft werden soll (Die Check box) Auch Wenns komisch klingt ist die Überprüfung mit Decimal stellen einfacher als die ohne Decimal stellen: Erst mal die mit: Code: Public Sub readsource(ByVal withdec As Boolean) If withdec = True Then Dim reader As New StreamReader(sourecepath) Do While reader.EndOfStream = False Lines.Add(reader.ReadLine()) Loop reader.Close() Exit Sub Eigentlich ganz einfach. Nachdem alles in die List geschrieben wurde kommt nun die suche nach den Zeilen. mit Lines.IndexOf("zu Suchender String") kann man das ganze List durchsuchen ob ein Element dem "zu Suchender String" entspricht, als Rückgabewert erhält man dann den Index (für das löschen wichtig). Das Problem hier ist das IndexOf bei einer List wirklich das komplette Element überprüft und nicht nur Teile davon. D.h. würde wir in der txt Datei nur das letze "s" von "Download: 0.00 KB/s" weglassen würde er es das Element schon nicht mehr finden und -1 zurückgeben. Nagut hier jetzt aber die suche nach den Zeilen: Code: Dim dlcount As Integer = 0 Dim dlspeed As Decimal = ToDecimal(TextBox_DlSpeed.Text.Replace(".", ",")) Dim dlspeedtext As String Label_dlview.Show() Do While dlspeed >= 0.0 dlspeedtext = dlspeed.ToString dlspeedtext = dlspeedtext.Replace(",", ".") Label_dlview.Text = "checking Donwload speed: " & dlspeedtext & " KB/s" GroupBox1.Refresh() Do While Not Lines.IndexOf("Download: " & dlspeedtext & " KB/s") = -1 Dim Index As Integer = 0 Index = Lines.IndexOf("Download: " & dlspeedtext & " KB/s") Lines.RemoveAt(Index) Lines.RemoveAt(Index - 1) Lines.RemoveAt(Index - 2) Lines.RemoveAt(Index - 3) Lines.RemoveAt(Index - 4) Lines.RemoveAt(Index - 5) dlcount = dlcount + 1 Loop dlspeed = dlspeed - 0.01 Loop Label_dlview.Text = "DL Speed Check done " & dlcount.ToString & " Servers removed" Mit dlcount geb ich am Schluss aus wie viele Server gelöscht wurden aufgrund des zu geringen Download speedes. Mit dlspeed wandel ich die eingabe in Decimal um zähle in der Schleife mit 0.01 Schritten bis 0 runter. Da er für die Umwandlung von String aber eine Komma getrennte zahl will ersetz ich den "." noch durch ein "," und wandel erst dann um, mit dem Wert kann ich dann runterzählen. Für den Suchstring brauch ich aber natürlich wieder einen "." deswegen das ganze nochmal zurück in der Schleife (damit immer der aktuelle wert wieder in den String eingesetzt wird) Mit Lines.removeAt(Index) enfern ich dann die Zeilen drüber usw. usw. für die meisten sicherlich selbsterklärend. Das ganze schaut für den Upload natürlich fast genauso aus. Jetzt noch kurz zu dem fall, das ohne Decimal geprüft werden soll, was ja immerhin am meisten vorkommt. Wie oben schon angesprochen kann ich nicht einfach mit lines.listof("Download: 0.") nach den Elementen in der List suchen. Deswegen bin ich einen kleinen Umweg gegangen. Ich hab eine zweite list(of String) verwendet und schreiben die zeilen gleich alle gekürzt in die List2: Code: Else Dim array As New ArrayList() Dim zeile As String Dim reader As New StreamReader(sourecepath) Do While reader.EndOfStream = False zeile = reader.ReadLine array.Add(zeile) Lines.Add(zeile) Loop For Each element In array Dim Text As String Dim index As Integer Text = element.ToString() If Text.IndexOf(".") = -1 Then lines2.Add(Text) Else Text = element.ToString() index = Text.LastIndexOf(".") Text = Text.Remove(index + 1) lines2.Add(Text) End If Next reader.Close() End If Ich hätts mir auch einfacher machen können und einfach immer die letzen 7 Zeichen löschen und das dann komplett in die list2 schreiben, aber egal^^ So und jetzt missbrauch ich einfach die list2 um meinen gekürzten String zu überprüfen und lösch das dann immer aus beiden lists raus: Code: Dim dlcount As Integer = 0 Dim dlspeed As Integer = ToInt16(TextBox_DlSpeed.Text.Remove(TextBox_DlSpeed.Text.IndexOf("."), 3)) Dim dlspeedtext As String Label_dlview.Show() Do While dlspeed >= 0 dlspeedtext = dlspeed.ToString Label_dlview.Text = "checking Donwload speed: " & dlspeedtext & ".XX KB/s" GroupBox1.Refresh() Do While Not lines2.IndexOf("Download: " & dlspeedtext & ".") = -1 Dim Index As Integer = 0 Index = lines2.IndexOf("Download: " & dlspeedtext & ".") lines2.RemoveAt(Index) lines2.RemoveAt(Index - 1) lines2.RemoveAt(Index - 2) lines2.RemoveAt(Index - 3) lines2.RemoveAt(Index - 4) lines2.RemoveAt(Index - 5) Lines.RemoveAt(Index) Lines.RemoveAt(Index - 1) Lines.RemoveAt(Index - 2) Lines.RemoveAt(Index - 3) Lines.RemoveAt(Index - 4) Lines.RemoveAt(Index - 5) dlcount = dlcount + 1 Loop dlspeed = dlspeed - 1 Loop Label_dlview.Text = "DL Speed Check done " & dlcount.ToString & " Servers removed" Auch hier wieder die Umwandlung, aber diesmal werden die letzen 3 Zeichen abgeschnitten und der String in Int16 konvertiert. Der Rest ist dann selbsterklärend. Und am schluss werden die Elemente dann in eine neue .txt geschrieben: Code: Dim writer As New StreamWriter(targetfile, overwrite) Try For Each Zeile As String In Lines writer.WriteLine(Zeile) Next writer.WriteLine(vbNewLine) writer.WriteLine("-----------------------------------------") writer.WriteLine("Filterd by Scan Result Filter Vers. " & Me.ProductVersion & " // file creation date: " & DateTime.Now.ToString) writer.Close() MsgBox("Success!" & vbNewLine & targetfile & " created") Catch ex As Exception MsgBox("Error:" & ex.ToString) End Try Button2.Enabled = True Hier könnte man noch einen Counter und eine Abfrage einbauen, damit man die Leerzeilen zwischen den Servern rausfiltert. Naja jetzt ist es schon fast ein Tut geworden aber wat solls^^ Hier das Projekt (Visual Basic 2010), wär nett wenns in Blog eingetragen wird Download Src: No File | www.xup.in Falls es derweil jemand fertig Kompeliert haben will, bei pn bei mir melden. Für Ideen, Bugs oder ähnliches bitte hier posten. + Multi-Zitat Zitieren
#2 4. November 2010 AW: Scan Result Filter Es ist verboten hier Binaries zu posten, du darfst nur den Source posten! + Multi-Zitat Zitieren
#3 4. November 2010 AW: Scan Result Filter Naja, sonderlich spannend ist das Programm nicht. Im Grunde sinds nur Min-Max Verifizierungen und per RegExp geparste Infos, daher verstehe ich nicht, dass Du Code vorenthälst. Beim KSnoop ist übrigends ein Resultfilter inklusive (0.16b) + Multi-Zitat Zitieren
#4 5. November 2010 AW: Scan Result Filter Edit: Hoppala, dann werd ich den Code Posten Source eingetragen evtl. wirds ja geprüft und die binary erlaubt bzw. in den blog eingetragen, so das auch user was davon haben die kein visual Studio auf dem pc haben Keins von beiden, da ich mich mit RegEx noch nicht beschäftigt habe ich das ganze mit IndexOf gemacht. Im Grunde wandel ich die Eingabe in Int bzw. Deciaml um und überprüfe mit einem Do While die Zeilen auf ein vorkommen, dabei zähl ich bis 0 runter. aber mehr dazu dann im code. Ich programmier noch nicht lange und würde mich auch noch als Anfägner zählen deswegen habe ich dafür auch ein paar Stunden gebraucht. Kann sein das dass KSnoop mit drin hat, hab das Prog. auf Anforderung geschrieben. + Multi-Zitat Zitieren