2013-11-11 3 views
0

У меня есть списки с несколькими вариантами. Образец первого спискапоиск определенного значения в текстовых файлах

Список 1)

hkdhksa
ОП-ID: 111112
jklfjdlkfsd
hfldhfjksdf
OP-ID: 111113
ghjg
ОП-ID: 111114
ОП-ID: 111115
gjgjhghgjhg
ОП-ID: 111116
ОП-ID: 111117
ОП-ID: 111118

Список 2)

ОП-ID: 111112
О.П. -ID: 11113
OP-ID: 111114
OP-ID: 111115
OP-ID: 111117

Результат будет: OP-ID: 11118 нет в списке 2

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 line = ("OP-ID: ") Like "OP-ID:*" Then 
      If Not file1.ContainsKey(part(0)) Then file1.Add(part(0), line) 
     End If 

    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 


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

    txtResults.Text = ("IDs should not be in list: " & str) 

End Sub 
+0

Что вы делаете или не делаете свой код? Также ваш код читает строки текста, но ваш образец показывает данные для каждого в одной строке. Вам нужно показать данные в точном формате, который вы используете. – tinstaafl

+0

см. Выше объединенные списки, как они выглядят в текстовых файлах –

ответ

0

Не уверен, почему вы используете словарь, когда имеете дело только с одним полем. Каждое значение имеет один и тот же ключ, и словари должны иметь уникальные ключи. Простой список (Of String) должны хорошо работать:

Private Sub Button1_Click(ByVal sender As System.Object, _ 
      ByVal e As System.EventArgs) Handles Button1.Click 
    Dim file1 As New List(Of String) 
    Dim file2 As New List(Of String) 
    For Each line As String In System.IO.File.ReadAllLines(TEST1) 
     If line.StartsWith("OP-ID:") Then 
      Dim temp As String = line.Split(" "c)(1) 
      If Not file1.Contains(temp) Then 
       file1.Add(temp) 
      End If 
     End If 
    Next 
    For Each line As String In System.IO.File.ReadAllLines(TEST2) 
     If line.StartsWith("OP-ID:") Then 
      Dim temp As String = line.Split(" "c)(1) 
      If Not file2.Contains(temp) Then 
       file2.Add(temp) 
      End If 
     End If 
    Next 
    Dim keysInList1ThatAreNotInList2() As String = file1.Except(file2).ToArray 
    Dim str = String.Join(vbCrLf, keysInList1ThatAreNotInList2) 
    txtResults.Text = ("IDs should not be in list: " & vbCrLf & str) 
End Sub 
0

Ваши списки образца не имеют никаких запятых, и это не ясно из вопроса, существуют ли они или нет.

Если нет запятых:

Если нет дубликатов в TEST1 (или вы не заботитесь о них):

Dim hs As New Hashset(Of String)(File.ReadLines(TEST1)) 
hs.ExceptWith(File.ReadLines(TEST2)) 
txtResults.Text = $"IDs not in list:{vbCrLf}{String.Join(vbCrLf, hs)}" 

Если дубликаты имеют важное значение:

Dim hs As New Hashset(Of String)(File.ReadLines(TEST2)) 
Dim notFound = File.ReadLines(TEST1).Where(Function(x) Not hs.Contains(x)).ToList 
txtResults.Text = $"IDs not in list:{vbCrLf}{String.Join(vbCrLf, notFound)}" 

Если есть запятые

(Общий код)

Dim keyParser = Function(x As String) 
     Dim indexOf = s.IndexOf(
     If indexOf = -1 Then Return x 
     Return Left(x, indexOf) 
    End Function 
Dim list2Keys = New Hashset(Of String)(File.ReadLines(TEST2).Select(keyParser)) 

Если нет дубликатов ключей в TEST1:

Dim list1 = File.ReadLines(TEST1).ToDictionary(keyParser) 
Dim notFound = list1.Where(Function(kvp) Not list2Keys.Contains(kvp.Key)).Select(Function(kvp) kvp.Value) 
txtResults.Text = $"IDs not in list:{vbCrLf}{String.Join(vbCrLf, notFound)}" 

Если есть повторяющиеся ключи в TEST1, но они этого не делают вопрос:

Dim list1 = File.ReadLines(TEST1).ToLookup(keyParser) 
Dim notFound = list1.Where(Function(grp) Not list2Keys.Contains(grp.Key)).Select(Function(grp) grp.First) 
txtResults.Text = $"IDs not in list:{vbCrLf}{String.Join(vbCrLf, notFound)}" 

If th e дубликаты в TEST1:

Dim list1 = File.ReadLines(TEST1).ToLookup(keyParser) 
Dim notFound = list1.Where(Function(grp) Not list2Keys.Contains(grp.Key)).SelectMany(Function(grp) grp) 
txtResults.Text = $"IDs not in list:{vbCrLf}{String.Join(vbCrLf, notFound)}" 
Смежные вопросы