Announcement

Collapse
No announcement yet.

Zeilen aus Textfile löschen (und andere Dinge)

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Zeilen aus Textfile löschen (und andere Dinge)

    Hallo liebe Leute !

    Bin dabei ein Programm zu schreiben welches zwei Textdateien miteinander vergleicht,
    nämlich Beleg.txt und FT_8501.txt.
    FT_8501.txt ist ein sehr langes Protokoll und es dürfen in diesem nur die Zeilen übrig bleiben, welche auch in Beleg.txt vorkommen.
    Sprich ich habe mal die Daten aus Beleg.txt in ein Array eingelesen, und mit FT_8501.txt verglichen, und bei Bedarf werden Datensätze (welche in Beleg.txt nicht vorkommen) aus der FT_8501.txt gelöscht.
    Spiele mich jetzt schon ewig herum, und es kommt trotzdem nur blödsinn heraus (Datensätze von FT_8501.txt hängt er mir einfach unten nochmal dran, usw.............)

    BITTE UM HILFE, EVTL. MIT EIN PAAR SNIPPETS !?

    Danke, und Lg ! Silvio

    Anbei mein bisheriger Code:

    Code:
        Private Sub cmd_abgleich_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmd_abgleich.Click
            Dim fname_er As String
            Dim fname_belegnr As String
            Dim line_er As String = ""
            Dim line_belegnr As String = ""
            Dim belegnr_er As String = ""
            Dim belegnr_belegnr As String = ""
            Dim tmp_er As ArrayList = New ArrayList
            Dim tmp_bn As ArrayList = New ArrayList
            Dim LineLength As Integer
    
            fname_er = txt_er.Text
            fname_belegnr = txt_belegnr.Text
    
            Dim fs_er As FileStream = New FileStream(fname_er, FileMode.OpenOrCreate, FileAccess.ReadWrite)
            Dim fs_bn As FileStream = New FileStream(fname_belegnr, FileMode.OpenOrCreate, FileAccess.ReadWrite)
            Dim sr_er As StreamReader = New StreamReader(fs_er)
            Dim sr_bn As StreamReader = New StreamReader(fs_bn)
            Dim sw_er As StreamWriter = New StreamWriter(fs_er)
    
            If MsgBox("WARNUNG ! Es werden nun nicht mehr benötigte Daten aus dem ER File entfernt !" & vbCrLf & "Falls Sie noch kein Backup der Originaldatei angelegt haben, so tun Sie dies bitte jetzt.", MsgBoxStyle.Critical + MsgBoxStyle.OkCancel) = MsgBoxResult.Cancel Then GoTo abort Else 
    
            Dim x As Decimal = 0
            Do While Me.Opacity > 0.5
                Me.Refresh()
                Me.Opacity -= 0.05
                For x = 1 To 100000
                Next x
            Loop
    
    
            Do While sr_bn.Peek <> -1
                line_belegnr = sr_bn.ReadLine()
                belegnr_belegnr = line_belegnr.Substring(0, 7)
                tmp_bn.Add(belegnr_belegnr)
            Loop
    
            Do While sr_er.Peek <> -1
                line_er = sr_er.ReadLine
                belegnr_er = Mid(line_er, 12, 7)
                MsgBox(belegnr_er)
                Console.WriteLine(belegnr_er)
                If tmp_bn.Contains(belegnr_er) Then
    
                Else
                    sw_er.BaseStream.Seek(0, SeekOrigin.Begin)
                    sw_er.WriteLine(line_er)
                    sw_er.BaseStream.SetLength(sw_er.BaseStream.Length - LineLength)
                End If
            Loop
    
            Do While Me.Opacity < 1.0
                Me.Refresh()
                Me.Opacity += 1.0
                For x = 1 To 100000
                Next x
            Loop
    
            'fs_er.Close()
            fs_bn.Close()
            'sr_er.Close()
            sr_bn.Close()
            'sw_er.Close()
            'sw_bn.Close()
    abort:
        End Sub

  • #2
    Hallo Silvio,

    Du machst Dir die Sache viel zu umständlich; und mit einer "indizierten Liste" würde es viel schneller gehen. Ich habe den Eindruck, dass Du Dich im Prinzip auskennst; deshalb beschränke ich mich zunächst auf einige Hinweise. Außerdem brauche ich dann keinen C#-Code in einem VB-Forum zu schreiben.
    • Lies die Log-Datei vollständig ein mit File.ReadAllLines(). Damit sind alle Zeilen aufgeteilt in ein Array.
    • Erzeuge daraus eine List<string> mit dem Konstruktor, der das Array als Parameter erhält.
    • Lies genauso die Vergleichsdatei ein und mache eine zweite List<string>.
    • Erzeuge eine neue leere List<string>.
    • Vergleiche die beiden Listen mit Contains; alle passenden Einträge werden in die neue Liste kopiert.
    • Mache aus der Liste mit List<T>.CopyTo() ein Array und speichere dieses mit File.WriteAllLines.

    Für jeden dieser Punkte brauchst Du im Prinzip nur ein bis zwei Zeilen; lediglich für die Schleife brauchst Du noch zwei Zeilen.

    Der ständige Wechsel zwischen Read/Write in einer Datei ist, wie Du gemerkt hast, fehleranfällig. Auch ist es fast unmöglich, innerhalb einer Datei etwas zu löschen; das muss stattdessen im Arbeitsspeicher gemacht werden (meine Vorschläge sind List<T>). Ich vermute, dass durch den einfacheren Arbeitsablauf auch das Problem mit den zusätzlichen Zeilen entfällt.

    Gruß Jürgen

    Comment


    • #3
      Hallo Jürgen !

      Danke für Deine schnelle Antwort !
      Der Schein trügt, ich bin ein VB.NET Newbie, und den Source habe ich mir innerhalb von vier tagen zusammengetragen.
      Bin daher um jeden Code Snippet dankbar !!!!
      Ich hab schon bemerkt das stöst auf Unverständnis, aber es wäre echt dringend (morgen).

      Vielen Dank im voraus !

      Silvio

      Comment


      • #4
        Es widerstrebt mir sehr, fertigen Code zu liefern. Außerdem habe ich Dir bereits die vollständigen Hinweise auf die SDK-Doku geliefert. Also musst Du nur dort nachschauen und das passende Beispiel kopieren.

        Der Code besteht dann aus folgenden Teilen (i.d.R. jeweils eine Anweisung):
        1. Datei 1 vollständig in ein String-Array einlesen
        2. String-Array in eine List<string> kopieren per "new List<string>(fileContent);"
        3. Datei 2 ebenso einlesen und kopieren
        4. eine weitere leere List<string> als Result-Liste erzeugen
        5. danach vergleichen:
          Code:
          foreach(string s in content1) {
              if (content2.Contains(s))
                  result.Add(s);
          }
        6. neues String-Array erzeugen für result.Length Elemente
        7. die result-Liste in dieses Array kopieren
        8. dieses String-Array speichern per File.WriteAllLines

        Mit genaueren Überlegungen lässt es sich noch verkürzen, aber soweit will ich nicht denken.

        Ist das so schwer? Jürgen

        Comment

        Working...
        X