So stellen Sie sicher, dass eine Datei in vb.net eine eindeutige Zeile enthält, wenn die Datei sehr groß ist

Sprache: vb.net Dateigröße: 1 GB und so.

Kodierung der Textdatei: UTF8 (so wird jedes Zeichen durch eine unterschiedliche Anzahl von Bytes dargestellt).

Kollation: UnicodeCI (wenn mehrere Zeichen im Wesentlichen gleich sind, ist die beliebteste Version die einzige.) Ich glaube, ich weiß, wie ich mit seinem umgehen soll.

Da jedes Zeichen durch eine unterschiedliche Anzahl von Bytes dargestellt wird und jede Zeile eine unterschiedliche Anzahl von Zeichen aufweist, variiert auch die Anzahl der Bytes in jeder Zeile.

Ich nehme an, wir müssen Hash für jede Zeile berechnen. Wir müssen auch die Position der Puffer an der jeweiligen Linie speichern. Dann müssen wir die Puffer vergleichen. Dann werden wir prüfen, ob die gleiche Zeile angezeigt wird oder nicht.

Gibt es dafür am besten spezielle Funktionen?

Antworten auf die Frage(2)

Lösung für das Problem

wie lang die Zeilen sind, können Sie möglicherweise einen MD5-Hashwert für jede Zeile berechnen und speichern als in aHashMap:

<code>Using sr As New StreamReader("myFile")
    Dim lines As New HashSet(Of String)
    Dim md5 As New Security.Cryptography.MD5Cng()

    While sr.BaseStream.Position < sr.BaseStream.Length
        Dim l As String = sr.ReadLine()
        Dim hash As String = String.Join(String.Empty, md5.ComputeHash(System.Text.Encoding.UTF8.GetBytes(l)).Select(Function(x) x.ToString("x2")))

        If lines.Contains(hash) Then
            'Lines are not unique
            Exit While
        Else
            lines.Add(hash)
        End If
    End While
End Using
</code>

Ungetestet, aber das kann schnell genug für Ihre Bedürfnisse sein. Ich kann mir nichts Schnelleres vorstellen, das immer noch ein bisschen prägnant wirkt :)

 user495106. Apr. 2012, 08:43
Ja, es ist das Ende des Stroms
 user495104. Apr. 2012, 07:57
+1 Ich habe auch deinen Code stark verändert. Dieser Ausgang während ist ein Fehler, etc.
 user495104. Apr. 2012, 06:46
Was ist die Größe des MD5? Eine unvollständige Methode ist die Verwendung eines ganzzahligen Hashs, der den Speicher komprimiert. Andererseits müssen mehrere verschiedene Zeilen den gleichen Hash haben. Deshalb müssen wir auch Pufferplätze speichern.
 Ry-04. Apr. 2012, 15:37
@ JimThio: Entschuldigung. MD5 ist 32 Bytes,Exit While ist kein Fehler, und wenn Sie einen besseren Weg kennen, um das Ende des Streams zu überprüfen, würde ich mich freuen, ihn zu hören.
 user495104. Apr. 2012, 08:40
sr.BaseStream.Position <sr.BaseStream.Length muss geändert werden. Grundsätzlich geht sr.BaseStream.Position oft viel weiter als die Stringlänge. Es wird immer um jeweils 1024 erhöht

Dies ist die zeitgemäße Antwort

<code>Public Sub makeUniqueForLargeFiles(ByVal strFileSource As String)
    Using sr As New System.IO.StreamReader(strFileSource)
        Dim changeFileName = reserveFileName(strFileSource, False, True)
        Using sw As New System.IO.StreamWriter(reserveFileName(strFileSource, False, True), False, defaultEncoding)
            sr.Peek()
            Dim lines As New Generic.Dictionary(Of Integer, System.Collections.Generic.List(Of Long))
            While sr.BaseStream.Position < sr.BaseStream.Length
                Dim offset = sr.BaseStream.Position
                Dim l As String = sr.ReadLine()
                Dim nextOffset = sr.BaseStream.Position
                Dim hash = l.GetHashCode
                Do ' a trick to put the for each in a "nest" that we can exit from
                    If lines.ContainsKey(hash) Then
                        Using sr2 = New System.IO.StreamReader(strFileSource)
                            For Each offset1 In lines.Item(hash)
                                sr2.BaseStream.Position = offset1
                                Dim l2 = sr2.ReadLine
                                If l = l2 Then
                                    Exit Do 'will sr2.dispose be called here?
                                End If
                            Next
                        End Using
                    Else
                        lines.Add(hash, New Generic.List(Of Long))
                    End If
                    lines.Item(hash).Add(offset)
                    sw.WriteLine(l)
                Loop While False
                sr.BaseStream.Position = nextOffset
            End While
        End Using
    End Using
End Sub
</code>

Ihre Antwort auf die Frage