1

ファイル B (潜在的に悪い) の内容をファイル A (既知の正常) に対して検証し、潜在的に悪いファイルから既知の各行を削除し、潜在的に悪い行のみを残すプログラムを作成しようとしています。私が抱えている問題は、各行にタイムスタンプが含まれていることです。タイムスタンプの後に始まる行の内容を確認するにはどうすればよいですか?

IE ファイル A:

MSI (c) (74:80) [08:09:43:718]: Resetting cached policy values
MSI (c) (74:80) [08:09:43:718]: Machine policy value 'Debug' is 0
MSI (c) (74:80) [08:09:43:718]: ******* RunEngine:

対ファイル B:

MSI (c) (E8:DC) [18:35:18:573]: Resetting cached policy values
MSI (c) (E8:DC) [18:35:18:573]: Machine policy value 'Debug' is 0
MSI (c) (E8:DC) [18:35:18:573]: ******* RunEngine:

これらはすべて等しいと見なす必要があります。違いの例はありませんが、基本的には、これらが削除された後に残るものになります。

これまでの私のコード:

Public Class Form1
Dim compto As New List(Of String)
Dim compfrom As New List(Of String)

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    Standard("filea.LOG")
    Readfile("fileb.LOG")
    Writefile("difference.txt")
End Sub


Public Sub Standard(ByVal Path As String)
    Using r As StreamReader = New StreamReader(Path)
        Dim line As String = Nothing
        line = r.ReadLine
        Do While (Not line Is Nothing)
            line = r.ReadLine
            If Not compto.Contains(line) Then compto.Add(line)
        Loop
    End Using
End Sub

Public Sub Readfile(ByVal Path As String)
    Dim pattern As String = "{30}([A-Za-z0-9\-]+"
    Using r As StreamReader = New StreamReader(Path)
        Dim line As String = Nothing
        line = r.ReadLine
        Do While (Not line Is Nothing)
            line = r.ReadLine
            If Not compto.Contains(line) Then compfrom.Add(line)
        Loop
    End Using
End Sub

Public Sub Writefile(ByVal Path As String)
    Using sw As StreamWriter = New StreamWriter(Path)
        For Each line As String In compfrom
            sw.WriteLine(line)
            ListBox1.Items.Add(line)
        Next
    End Using
End Sub

End Class

これまでのところ、このコードは完全一致を削除しますが、それが私が立ち往生している場所です。どんな助けでも素晴らしいでしょう。

ありがとう。

ソリューション編集:

Public Sub Writefile(ByVal Path As String)
    Dim GetLine As Func(Of String, String) = Function(line) Regex.Match(line, "\]: (.*)").Groups(1).Value
    Dim Diff As New HashSet(Of String)(File.ReadLines("filea.log").Select(GetLine))
    Diff.SymmetricExceptWith(File.ReadLines("fileb.log").Select(GetLine))
    Using sw As StreamWriter = New StreamWriter(Path)
        For Each line As String In Diff
            sw.WriteLine(String.Join("", line))
            ListBox1.Items.Add(String.Join("", line))
        Next
    End Using
End Sub
4

2 に答える 2

2

このリンクに基づいて、これを試してください:

Dim GetLine As Func(Of String,String) = Function(line) Regex.Match(line,"\]: (.*)").Groups(1).Value

'IF the timestamp is always at the same position, it may be more efficient to 
'avoid regular expressions. YMMV
GetLine = Function(line) line.Substring(32)

Dim Diff = New HashSet(File.ReadLines("filea.LOG").Select(GetLine))
Diff.SymmetricExceptWith(File.ReadLines("fileb.LOG").Select(GetLine))
于 2013-08-29T23:56:02.583 に答える
1

File Aの一意の各行を の各行と比較しているように見えますがFile B、行ヘッダーMSI (c) (74:80) [08:09:43:718]:はこの比較には関係なく、一定の長さです。

コードを変更する可能性があります (4 つのインスタンス):

line = r.ReadLine

に:

line = r.ReadLine.Substring(32)

Substring()整数パラメータを 1 つ指定すると、指定された文字位置から始まる文字列の残りの部分が返されます。

于 2013-08-30T00:14:46.357 に答える