1

多数の重複が発生する巨大なテキスト ファイルがあります。重複は以下の通り。

総投稿数 16

ピン コード = GFDHG
タイトル = ロンドンのショップ サイン/プロジェクション サイン/産業用サイン/レストラン サイン/メニュー ボード&ボックス
日付 =
12-09-2012 追跡キー # 85265E712050-15207427406854753

総投稿数 16

ピン コード = GFDHG
タイトル = ロンドンのショップ サイン/プロジェクション サイン/産業用サイン/レストラン サイン/メニュー ボード&ボックス
日付 =
12-09-2012 追跡キー # 85265E712050-15207427406854753

総投稿数 2894

ピン コード = GFDHG
タイトル = ロンドンのショップ サイン/プロジェクション サイン/産業用サイン/レストラン サイン/メニュー ボード&ボックス
日付 = 15-09-2012
追跡キー # 85265E712050-152797637654753

総投稿数 2894

ピン コード = GFDHG
タイトル = ロンドンのショップ サイン/プロジェクション サイン/産業用サイン/レストラン サイン/メニュー ボード&ボックス
日付 = 15-09-2012
追跡キー # 85265E712050-152797637654753

このテキスト ファイルには合計 4000 件の投稿があります。私のプログラムで、合計投稿 6 を、ファイル内で発生したすべての合計投稿と一致させ、重複を見つけてから、プログラムでその重複を削除し、その重複の次の 7 行も削除するようにします。ありがとうございました

4

1 に答える 1

0

フォーマットが一貫していると仮定すると (つまり、ファイルに記録された各イベントは合計 6 行のテキストを使用する)、ファイルから重複を削除する場合は、次のようにする必要があります。

Sub DupClean(ByVal fpath As String) 'fpath is the FULL file path, i.e. C:\Users\username\Documents\filename.txt
        Dim OrigText As String = ""
        Dim CleanText As String = ""
        Dim CText As String = ""
        Dim SReader As New System.IO.StreamReader(fpath, System.Text.Encoding.UTF8)
        Dim TxtLines As New List(Of String)
        Dim i As Long = 0
        Dim writer As New System.IO.StreamWriter(Left(fpath, fpath.Length - 4) & "_clean.txt", False) 'to overwrite the text inside the same file simply use StreamWriter(fpath)

        Try
            'Read in the text
            OrigText = SReader.ReadToEnd

            'Parse the text at new lines to allow selecting groups of 6 lines
            TxtLines.AddRange(Split(OrigText, Chr(10))) 'may need to change the Chr # to look for depending on if 10 or 13 is used when the file is generated
        Catch ex As Exception
            MsgBox("Encountered an error while reading in the text file contents and parsing them. Details: " & ex.Message, vbOKOnly, "Read Error")
            End
        End Try

        Try
            'Now we iterate through blocks of 6 lines 
            Do While i < TxtLines.Count
                'Set CText to the next 6 lines of text
                CText = TxtLines.Item(i) & Chr(10) & TxtLines.Item(i + 1) & Chr(10) & TxtLines.Item(i + 2) & Chr(10) & TxtLines.Item(i + 3) & Chr(10) & TxtLines.Item(i + 4) & Chr(10) & TxtLines.Item(i + 5)

                'Check if CText is already present in CleanText
                If Not (CleanText.Contains(CText)) Then
                    'Add CText to CleanText
                    If CleanText.Length = 0 Then
                        CleanText = CText
                    Else
                        CleanText = CleanText & Chr(10) & CText
                    End If
                End If 'else the text is already present and we don't need to do anything

                i = i + 6
            Loop
        Catch ex As Exception
            MsgBox("Encountered an error while running cleaning duplicates from the read in text. The application was on the " & i & "-th line of text when the following error was thrown: " & ex.Message, _
                   vbOKOnly, "Comparison Error")
            End
        End Try

        Try
            'Write out the clean text
            writer.Write(CleanText)
        Catch ex As Exception
            MsgBox("Encountered an error writing the cleaned text. Details: " & ex.Message & Chr(10) & Chr(10) & "The cleaned text was " & CleanText, vbOKOnly, "Write Error")
        End Try
    End Sub

形式が一貫していない場合は、ループを通過する特定のパスで CText に追加する行を指定するために、より洗練されたルールを定義する必要がありますが、コンテキストがなければ、何についてのアイデアを提供することはできません。それらはそうかもしれません。

于 2015-03-02T18:45:14.303 に答える