große Textdateien vergleichen

  • Allgemein

Es gibt 4 Antworten in diesem Thema. Der letzte Beitrag () ist von Janno.

    große Textdateien vergleichen

    Hi,

    in VB bin ich noch Anfänger und Neu hier im Forum. Ich habe nur VBA (Excel 2007) kenntnisse. So nun zu meiner Frage/Problem.
    Ich möchte mehrere große Textdateien vergleichen (ca. 900.000 Zeilen - 28 MB).

    Aufbau einer Zeile in der Textdatei:
    WertA WertB WertC

    Nun möchte ich die erste Datei einladen, dann die zweite Datei und vergleichen
    ob WertA und WertB aus Zeile1 in Datei1 gleich WertA und WertB aus einer Zeile in Datei2
    wenn ja dann soll zusätzlich der kleinere WertC in Datei1 Zeile1 eintragen werden.
    Das soll dann für alle Zeilen in der Textdatei geführt werden.

    So was ähnliche habe ich mit VBA und Excel schon hin bekommen. Da aber Excel eine Zeilen begrenzung 1 Mio. hat und da es vorkommen kann das auch ich Textdateien mit mehr 1. Mio Zeilen habe. Wollte ich es versuchen VB zulösen. Da meiner Meinung der Weg in Excel aus recht umständlich ist (Textdatei einlesen - verarbeiten - Textdatei schreiben)

    Meine Frage ist nun kann man es VB lösen? Ich stelle es mir so vor das mann die Dateien in den Speicher lädt und nach der verarbeitung in eine Textdatei schreibt


    Gruß

    Janno
    Als Idee:

    VB.NET-Quellcode

    1. Public Sub CompareThread()
    2. Dim l() As String
    3. Dim i(2) As String, k As Long
    4. ' Hashtable mit Daten aus Src File füllen
    5. h.Clear()
    6. For Each s As String In System.IO.File.ReadAllLines(SrcFile)
    7. ' jede Zeile zerlegen und speichern
    8. l = Split(s, " ")
    9. If l.Count <> 3 Then Throw New Exception("Do some error handling pls")
    10. For j = 0 To 2
    11. If Not Integer.TryParse(l(j), i(j)) Then Throw New Exception("Do some error handling pls")
    12. Next
    13. k = i(0)
    14. k <<= 32
    15. k += i(1)
    16. h.Add(k, i(2))
    17. Next
    18. ' Und jetzt die andere Datei und vergleichen
    19. Dim v As Integer
    20. For Each s As String In System.IO.File.ReadAllLines(DstFile)
    21. ' jede Zeile zerlegen und speichern
    22. l = Split(s, " ")
    23. If l.Count <> 3 Then Throw New Exception("Do some error handling pls")
    24. For j = 0 To 2
    25. If Not Integer.TryParse(l(j), i(j)) Then Throw New Exception("Do some error handling pls")
    26. Next
    27. k = i(0)
    28. k <<= 32
    29. k += i(1)
    30. If h.ContainsKey(k) Then
    31. v = h(k)
    32. If i(2) < v Then h(k) = i(2)
    33. End If
    34. Next
    35. ' Und jetzt den ganzen Rotz wieder ausgeben
    36. ' Wegen Hashtable geht die ursprüngliche Sortierung verloren, wenn man das
    37. ' nicht will, muss man halt etwas mehr schreiben
    38. End Sub