String modifizieren?!

  • VB.NET

Es gibt 52 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    String modifizieren?!

    Okay,
    Also ich hab ein recht kompliziertes Problem an dem ich schon stunden sitze:
    Also zuerst mal die Erklärung.
    Auf meinem Server befindet sich ein txt File mit dieser Formatierung:

    Quellcode

    1. U4ESWRM2O|||Info1|||SomeStuff|||BlubbBlubb|||Trolololo
    2. 8WW64VEEM|||AnotherInfo|||Test|||Blububu|||Whatsup?


    So, ihr seht jede Zeile beginnt mit einer 9-Stelligen Nummer.
    Diese will ich aus jeder Zeile auslesen, (also Pro Zeile nur die ersten 9 Charaktere)
    Das habe ich gelöst bekommen, und zwar so:

    VB.NET-Quellcode

    1. Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
    2. ListBox1.Items.Clear()
    3. For Each x As String In New System.Net.WebClient().DownloadString("http://myserver.net/File.txt").Split(vbNewLine)
    4. Dim y As String = x.Split("|")(0)
    5. ListBox1.Items.Add(y)
    6. Next
    7. End Sub


    Das klappt soweit, möglichweise lässt sich hier ja nochwas optimieren.
    Das eigentliche Problem jetzt aber ist:
    Ich muss einen String (als Beispiel aus einer TextBox) mit jeder ID (also wieder den ersten 9 Zeichen) in dem TextFile vergleichen.
    Wenn sie existiert, soll die komplette Zeile gelöscht werden welche die ID enthält, und danach die leere Zeile entfernen.
    Das ganze soll ohne die Datei herunterzuladen, also nur per Memorystream oder DownloadString oderso.
    Das entfernen ist mein großes Problem, das kriege ich nicht hin.
    Was mache ich falsch?
    Das testen ob die ID bereits exisitert habe ich auch hinbekommen:

    VB.NET-Quellcode

    1. Dim ergebnis As String = "0"
    2. Dim sr As New StreamReader(New MemoryStream(System.Text.Encoding.UTF8.GetBytes(New Net.WebClient().DownloadString("http://myserver.net/File.txt"))))
    3. Do Until sr.EndOfStream
    4. Dim myID As String = TextBox1.Text
    5. If sr.ReadLine().Substring(0, 9).Contains(myID) Then
    6. ergebnis += "1"
    7. Else
    8. ergebnis += "0"
    9. End If
    10. Loop
    11. If ergebnis.Contains("1") Then
    12. MsgBox("ID exists")
    13. ElseIf ergebnis.Contains("0") Then
    14. MsgBox("ID doesn't exist.")
    15. End If


    Vllt lässt sich hier ja auch noch was optimieren, auf jeden Fall ist mein Hauptproblem das enternen der Zeile ohne die komplette Datei herunterladen zu müssen.
    kann mir jemand helfen? :(
    C# Developer
    Learning C++

    ~blaze~ schrieb:

    Hi
    schau' dir außerdem mal Dictionary(Of TKey, TValue) an, mit dem geht sowas sehr einfach und effizient. Substring statt Split ist außerdem auch sinnvoll in deinem Fall (bzw. splitte nach {"|||"} und zwar nur 1x, wenn du den Reststring ebenfalls benötigst).

    Gruß
    ~blaze~

    Danke erstmal für deine Antwort, aber kannst du das mal etwas näher erklären ich verstehe das nicht ganz.
    Und wichtig ist halt das ich die Zeile die die Nummer enthält lösche, danach die leere Zeile entferne und das ganze ohne das man die Datei herunterladen und offline modifizieren muss.:o
    C# Developer
    Learning C++
    Wie willst sie denn online modifizieren? 'n Programm hochladen und dann starten oder was? Schick dem Server einfach ein Kommando, er soll die Zeile löschen und reagiere dort darauf. Da löscht du halt einfach dann den String in einer Tabelle oder Datenbank, whatever. Ist ja offensichtlich eine Art Primärschlüssel.

    Gruß
    ~blaze~
    Ich habe mir das so vorgestellt:
    DownloadString in ein Array.
    Analysieren jede Zeile auf den spezifischen String.
    Lösche die Zeile und die dann entstanden leere Zeile.
    Lade das Array wieder per UploadString zurück...
    C# Developer
    Learning C++
    mal angenommen, eine Datenbank sein nicht vorteilhaft - ich verstehe nicht so recht das Problem:
    Du kannst die Datei runterladen, sie in Zeilen zerlegen, unerwünschte Zeilen identifizieren, entfernen, alles wieder zu einem String zusammensetzen und wieder uploaden.

    Wo in dieser Verarbeitungskette hakt es?

    ErfinderDesRades schrieb:

    Wo in dieser Verarbeitungskette hakt es?

    Beim herunterladen der Datei.

    Geht es den nicht das in einem MemoryStream oder nur per DownloadString?
    Ich möchte keine unnötigen Dateien erzeugen.
    Das bearbeiten muss doch genauso möglich sein wenn es irgendwie vernünftigen in Variablen & Arrays etc eingelesen wird, oder nicht? 8|
    C# Developer
    Learning C++

    ~blaze~ schrieb:

    bzw. splitte nach {"|||"} und zwar nur 1x, wenn du den Reststring ebenfalls benötigst
    Für sowas braucht man Regex.

    Ich würde dir mal raten einfach nach "Regex" oder "Regular Expressions"-Tutorials zu suchen.
    Damit kannst du viel anfangen.
    Dein Ansatz mit einem Array passt da auch sehr gut dazu.

    Ansonsten ist der Weg, runterladen, zerlegen, überflüssige Lines löschen, zusammensetzen und hochladen.

    Rikudo schrieb:

    DownloadString in ein Array.
    Wie wärs, wenn du mit Regex den DownloadString splittest und daraus ein Array erzeugst?
    M.f.G. Nitro-X
    Gute Spieler cheaten schlecht! 8-)

    Button1.Visible = False
    If Button1.Click then Shell ("C:\brain.exe")
    end if

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Nitro-X“ ()

    SpaceyX schrieb:

    Optimieren lässt sich mit OPTION STRICT ON. Voher schau ich mir Deinen Code nicht an.

    Hab jetzt mal IOption Strict On, und den Code um nur die Nummern auszulesen angepasst:

    VB.NET-Quellcode

    1. Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
    2. ListBox1.Items.Clear()
    3. For Each x As String In New System.Net.WebClient().DownloadString("http://server.net/File.txt").Split(CChar(vbNewLine))
    4. Dim y As String = x.Split(CChar("|"))(0)
    5. ListBox1.Items.Add(y)
    6. Next
    7. End Sub


    Hast du eine Idee wie ich das löschen einzelner Zeilen lösen kann ohne die Datei herunterladen zu müssen (also iwie nur per MemoStream oder DownloadString)?
    C# Developer
    Learning C++
    Du lädst ja in dem Sinne keine Datei runter, sondern den Inhalt. Mit DownloadString bist Du da ja schon auf der richtigen Seite. Evtl. die Asynchrone-Methode nutzen, aber kein muss. Du kannst die Datei nicht direkt modifizieren, so wie Du es Dir evtl. vorstellst. Also lad den Inhalt runter, modifiziere den Inhalt und lad den Inhalt in Deine Datei auf den Server (löschen => neu schreiben). Das unterliegende Protokoll erlaubt nun mal nur herunterladen, hochladen.

    Oder wie Dir @~blaze~: klar machen wollte, erledige dies ggf. über ein PHP-Skript.
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o

    Nitro-X schrieb:

    ~blaze~ schrieb:

    bzw. splitte nach {"|||"} und zwar nur 1x, wenn du den Reststring ebenfalls benötigst
    Für sowas braucht man Regex.

    Ich würde dir mal raten einfach nach "Regex" oder "Regular Expressions"-Tutorials zu suchen.
    Damit kannst du viel anfangen.
    Dein Ansatz mit einem Array passt da auch sehr gut dazu.

    Ansonsten ist der Weg, runterladen, zerlegen, überflüssige Lines löschen, zusammensetzen und hochladen.

    Rikudo schrieb:

    DownloadString in ein Array.
    Wie wärs, wenn du mit Regex den DownloadString splittest und daraus ein Array erzeugst?

    Okay...
    Und da stellen sich mir diese Fragen:
    1) Wie runterladen, den String in ein Array? Bzw jede Zeile? Wie mach ich das?
    2) Wie enterfne ich die entsprechende Line, nachdem ich den String runtergeladen hab?
    C# Developer
    Learning C++

    Rikudo schrieb:

    Wie runterladen, den String in ein Array? Bzw jede Zeile? Wie mach ich das?
    willst du uns veräppeln?
    Den Code dafür hast du doch in post#1 bereits gegeben, und gesagt, das funzeniere soweit.
    achso - fehlt das Array, also

    VB.NET-Quellcode

    1. dim lineArray=New System.Net.WebClient().DownloadString("http://myserver.net/File.txt").Split(vbNewLine)
    2. For Each x As String In lineArray
    3. Dim y As String = x.Split("|")(0)
    4. 'y testen
    5. Next
    Sorry, jetz' mal, meinste das echt ernst? Wie soll man dir helfen, wenn du nur bröckchenweise auf das eingehst, was wir hier sagen? Ich pöbel ja nur ungerne herum, aber mir gehts echt zunehmend auf den Keks.
    Dein System ist für Fehlverhalten vorprogrammiert, wenn du die Clients die Datei verändern lässt, selbst wenn man "Hacker" außen vorlässt. Kommuniziere einfach mit dem Server und lasse den die Aktionen ausführen. Das hab' ich dir aber oben bereits erklärt. Wenn zwei Clients verzahnt auf die Datei zugreifen löscht der eine die Änderungen vom anderen, wenn sie sich nicht gleich gegenseitig in die Quere kommen. Es kann so nicht funktionieren. Die Lösung für dieses Problem lautet bspw. Php/Asp.Net - oder du nimmst ein anderes Protokoll, wie z.B. Tcp und programmierst die Client-/Serverkommunikation manuell, das macht's aber definitiv NICHT einfacher.
    Es wird btw. auch KEIN Regex für jeden noch so kleinen String-Witz benötigt. Schaut euch doch mal String.Split an. String selbst enthält so viele schöne Sachen.

    Gruß
    ~blaze~
    In der Hinsicht muss ich ~blaze~ Recht geben. Wenn du selbst nur einen Client für irgendwas harmloses benutzen willst, kannst du es nach deiner Variante machen.

    ~blaze~ schrieb:

    Es wird btw. auch KEIN Regex für jeden noch so kleinen String-Witz benötigt. Schaut euch doch mal String.Split an. String selbst enthält so viele schöne Sachen.
    Das stimmt auch. Aber bei "characters" mit mehreren Zeichen, benötigt man Regex, dass kann String.Split nicht. Er könnte allerdings seine "Protokoll"- bzw. "Trennzeichen"-schreibweise auf nur ein Zeichen ändern.
    M.f.G. Nitro-X
    Gute Spieler cheaten schlecht! 8-)

    Button1.Visible = False
    If Button1.Click then Shell ("C:\brain.exe")
    end if

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Nitro-X“ ()