2013-11-08 2 views
0

Я хочу найти текстовый файл для значений, содержащихся в другом текстовом файле. результат отображает значения, не содержащиеся в списке 2Поиск одного текстового файла для значений в другом текстовом файле

Public Class Form1 

    Const TEST1 = "\\folder\compare\list1.txt" 
    Const TEST2 = "\\folder\compare\list2.txt" 

    Private Sub Button1_Click(ByVal sender As System.Object, _ 
      ByVal e As System.EventArgs) Handles Button1.Click 
    'Declare two dictionaries. The key for each will be 
    ' the text from the input line up to, 
    'but not including the first ",". 
    ' The valus for each will be the entire input line. 

    Dim file1 As New HashSet(Of String) '! 
    'Dim file1 As New Dictionary(Of String, String) 
    Dim file2 As New Dictionary(Of String, String) 

    For Each line As String In System.IO.File.ReadAllLines(TEST1) 
     Dim part() As String = line.Split(",") 
     If Not file1.ContainsKey(part(0)) Then file1.Add(part(0), line) 

    Next 

    For Each line As String In System.IO.File.ReadAllLines(TEST2) 
     Dim part() As String = line.Split(",") 
     If Not file2.ContainsKey(part(0)) Then file2.Add(part(0), line) '! 
    Next 

    AddText("The following lines from " & TEST2 & " are also in " & TEST1) 

    For Each key As String In file2.Keys 
     If file1.Contains(key) Then 
      AddText(file2(key)) 
     End If 
    Next 
    Dim keysInList1ThatAreNotInList2 = file1.Except(file2.Keys).ToList '! 



    Dim values = From key In keysInList1ThatAreNotInList2 Select file1(key) 
    Dim str = String.Join(vbCrLf, values) 
    AddText("ID should not be in this list" & str) 

    End Sub 

    Private Sub AddText(ByVal text As String) 
     txtResults.Text &= text & vbCrLf 
    End Sub 

End Class 

я хочу найти текстовый файл для значений, содержащихся в другом текстовом файле. результат отображает значения, не содержащиеся в списке 2. в настоящий момент он работает, пока значения уникальны. Я хочу найти большой текстовый файл для определенных значений.

+0

Well Dictionary имеет метод ContainsKey(), который вы можете использовать, чтобы определить, существует ли ключ как часть словаря. Если значение true, добавление того же ключа снова приведет к ошибке. – Ric

+0

, если значения больше не уникальны, а затем используйте '.ContainsKey' при чтении файлов и не добавляйте уже существующие элементы. это предполагает, что не уникальные ключи не связаны с уникальными значениями. – Plutonix

+0

спасибо, ребята, можете ли вы вставить туда, куда я бы поместил, содержащийся, им не знакомы с тем, как его использовать. Т.е. копировать и вставлять код в ответ с помощью ключа. –

ответ

0

Решение, кажется, ищет только для первого совпадения, поэтому необходимо игнорировать двуличности при создании file1, file2

Public Class Form1 

    Const TEST1 = "\\folder\compare\list1.txt" 
    Const TEST2 = "\\folder\compare\list2.txt" 

    Private Sub Button1_Click(ByVal sender As System.Object, _ 
       ByVal e As System.EventArgs)  Handles Button1.Click 
    'Declare two dictionaries. The key for each will be 
    ' the text from the input line up to, 
    'but not including the first ",". 
    ' The valus for each will be the entire input line. 

    Dim file1 As New Dictionary(Of String, String) 
    Dim file2 As New Dictionary(Of String, String) 

    For Each line As String In System.IO.File.ReadAllLines(TEST1) 
     Dim part() As String = line.Split(",") 
     If Not file1.ContainsKey(part(0)) Then file1.Add(part(0), line)'! 

    Next 

    For Each line As String In System.IO.File.ReadAllLines(TEST2) 
     Dim part() As String = line.Split(",") 
     If Not file2.ContainsKey(part(0)) Then file2.Add(part(0), line)'! 

    Next 

    AddText("The following lines from " & TEST2 & " are also in " & TEST1) 

    For Each key As String In file2.Keys 
     If file1.ContainsKey(key) Then 
      AddText(file2(key)) 
     End If 
    Next 
    Dim keysInList1ThatAreNotInList2 = file1.Keys.Except(file2.Keys).ToList 

    Dim values = From key In keysInList1ThatAreNotInList2 Select file1(key) 
    Dim str = String.Join(vbCrLf, values) 
    AddText(str) 

End Sub 

Private Sub AddText(ByVal text As String) 
    txtResults.Text &= text & vbCrLf 
End Sub 

Примечание Чтобы избежать путаницы, я удалил оригинальный ответ. Это новый полный.

+0

спасибо, что, похоже, работает, единственная проблема - мне нужно сузить поиск, чтобы искать элементы со словом ID, за которым следует число, поэтому поиск будет чем-то вроде IF line = («ID%» & value), знаете ли вы, что лучший способ выполнить поиск в комбинированной строке, подобной этой. Я предположил, что вы будете использовать подстановочный знак, например%. –

+0

Вам нужно что-то как 'If line like" ID * "& value Then' ([Like Operator (Visual Basic)] (http://msdn.microsoft.com/EN-US/library/vstudio/swf8kaxw (v = vs .110) .aspx)) для более сложного сопоставления лучше использовать [Регулярные выражения] (http://msdn.microsoft.com/en-us/library/system.text.regularexpressions.regex.aspx). – IvanH

Смежные вопросы