[.NET] Scan Result Filter

Dieses Thema im Forum "Projekte / Codes" wurde erstellt von Silentuser, 4. November 2010 .

Schlagworte:
  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)

    Bild
    {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.
     
  2. 4. November 2010
    AW: Scan Result Filter

    Es ist verboten hier Binaries zu posten, du darfst nur den Source posten!
     
  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)
     
  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.
     
  5. Video Script

    Videos zum Themenbereich

    * gefundene Videos auf YouTube, anhand der Überschrift.