Изменить мой текстовый файл, чтобы отображалось только самое высокое значение?

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

Dim intValue As Integer
        Dim intMaxValue As Integer = Integer.Parse(textbox1.Text)

        Dim strSourceFile As String = IO.Path.Combine("G:\test.txt")
        Dim OutPutFile As String = IO.Path.Combine("G:\test2.txt")

        Dim strLines() As String = IO.File.ReadAllLines(strSourceFile)
        Dim strFiltered As New System.Text.StringBuilder
        Dim strTemp() As String

        For Each strLine In strLines
            If strLine.Trim.Length <> 0 Then
                strTemp = strLine.Split(" "c)
                If Trim(strTemp(0)) = "USER" AndAlso Trim(strTemp(2)) = "1" Then
                    strLine = strTemp(8).Trim & " " & strTemp(16).Trim
                    If Integer.TryParse(strLine.Split(" "c)(1), intValue) Then
                        If intValue <= intMaxValue Then
                            strFiltered.Append(strLine & Environment.NewLine)
                        End If
                    End If
                End If
            End If

        Next

        IO.File.WriteAllText(OutPutFile, strFiltered.ToString)

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

String1 100
String1 256
String1 500
String2 100
String2 256
String3 876
String3 345
String3 643
String3 102
String4 100
String4 084
String5 492
String5 178
String6 873
String6 156
String6 786

На что я надеялся, так это добавить дополнительное кодирование, поэтому я хочу, чтобы отображалась только строка с наибольшим числом, чтобы приведенное выше выглядело так:

String1 500
String2 256
String3 876
String4 100
String5 492
String6 873

Можно ли добавить последний бит кода?

ОБНОВЛЕНИЕ

Вместо того, чтобы проверять наибольшее число и удалять другие поля, я хочу проверить каждое соответствующее поле в столбце 1 и проверить наибольшее число, и если оно больше, чем поле в текстовом поле 1, то удалить все строки для этих соответствующих полей в столбце 1. Если наибольшее число меньше, чем поле в textbox1, затем сохраните эту строку, но удалите другие соответствующие поля столбца 1. Так например

String1 100
String1 256
String1 500
String2 100
String2 256
String3 876
String3 345
String3 643
String3 102
String4 100
String4 084
String5 492
String5 178
String6 873
String6 156
String6 786

Итак, если textbox1 должен был иметь 550, вы должны были

String1 500
String2 256
String4 100
String5 492

Обновление 2

Значение в текстовом поле1 равно

1341273599

Когда я только фильтрую столбцы, чтобы показать столбец 1 и столбец 2, я получаю следующее.

S00048 1428142557
S00048 1428141809
S00048 1338805621
S00048 1310295931
S00048 1309086124
S00048 1432203954
S00048 1431686625
S00048 1428142556
S00048 1431686626
S00048 1334743408
S00042 1324204635
S00040 1313659927
S00037 1308388943
S00033 1303118141
S00032 1391422317
S00032 1391422304
S00032 1298024019
S00032 1391422303
S00032 1391422316

Итак, когда я запускаю фактическое кодирование, я получаю следующее

S00048 1338805621
S00042 1324204635
S00040 1313659927
S00037 1308388943
S00033 1303118141
S00032 1298024019

Возможно, вы сможете увидеть, что конечный результат неверен?


person JackSparrow    schedule 29.06.2012    source источник


Ответы (1)


Вы можете использовать словарь для хранения значений:

    Dim FilteredDictionary as new Dictionary(string, integer)

    Dim intValue As Integer
    Dim intMaxValue As Integer = Integer.Parse(textbox1.Text)

    Dim strSourceFile As String = IO.Path.Combine("G:\test.txt")
    Dim OutPutFile As String = IO.Path.Combine("G:\test2.txt")

    Dim strLines() As String = IO.File.ReadAllLines(strSourceFile)
    Dim strFiltered As New System.Text.StringBuilder
    Dim strTemp() As String

    Dim lastIntValue as integer = 0
    For Each strLine In strLines
        If strLine.Trim.Length <> 0 Then
            strTemp = strLine.Split(" "c)
            If Trim(strTemp(0)) = "USER" AndAlso Trim(strTemp(2)) = "1" Then
                strLine = strTemp(8).Trim & " " & strTemp(16).Trim
                If Integer.TryParse(strLine.Split(" "c)(1), intValue) Then
                      If intValue = 0 Then
                        intValue=lastIntValue
                      Else
                        lastIntValue=intValue
                      End If
                      If FilteredDictionary.ContainsKey(strTemp(8).Trim) then
                        If intValue > FilteredDictionary(strTemp(8).Trim) then
                          FilteredDictionary(strTemp(8).Trim) = intValue
                        End If
                      Else
                        FilteredDictionary.Add(strTemp(8).Trim, intValue)
                      End If
                        'strFiltered.Append(strLine & Environment.NewLine)

                End If
            End If
        End If
    Next

    'Modifed stringbuilder to only add those items that are less than or equal to
    'a given value in Textbox1.  Note that if Textbox1 is not an integer,
    'it will throw an error.  You could use Integer.TryParse instead.
    For Each item As String in FilteredDictionary.Keys.ToList
       If FilteredDictionary(item) <= Convert.ToInt32(Textbox1.Text)
         strFiltered.AppendLine(item & " " & FilteredDictionary(item))
       EndIf
    Next
    IO.File.WriteAllText(OutPutFile, strFiltered.ToString)
person Holger Brandt    schedule 29.06.2012
comment
Привет, Хольгер, ты о чем? Я мог бы сделать с небольшой помощью, пожалуйста. Или мы могли бы взять его, чтобы поболтать? - person JackSparrow; 02.07.2012
comment
Конечно, давайте пообщаемся. Подскажите название чата. - person Holger Brandt; 02.07.2012
comment
Хольгер, извините, я не могу войти в чат, потому что там написано, что у меня недостаточно репутации?? Я отредактирую первый пост и дам вам знать о моей проблеме. - person JackSparrow; 02.07.2012
comment
Итак, насколько я понимаю ваше последнее обновление, вы ищете пользовательские записи, которые не превышают заданное значение, в данном случае 550. Однако не будет ли String3 по-прежнему возвращать 345? Я немного смущен, глядя на ваши результаты. - person Holger Brandt; 02.07.2012
comment
Привет, нет, так как String3 имеет 643, что выше 550. Итак, все строки выше 550, я хочу удалить группу, т.е. String1, String2, String3 и (как и ранее) иметь только самое высокое значение, отображаемое из тех, которые меньше чем 550. - person JackSparrow; 02.07.2012
comment
Думаю, я понял. Я изменил этот последний раздел, который создает строку. Если строка больше, чем значение Textbox1.Text, она не будет включена в результирующую строку. - person Holger Brandt; 02.07.2012
comment
Спасибо, Хольгер, я попробовал кодирование, но если значение в textbox1 выше, то оно не удаляет все совпадающие строки? - person JackSparrow; 02.07.2012
comment
давайте продолжим это обсуждение в чате - person Holger Brandt; 02.07.2012
comment
Хольгер, у меня есть быстрый вопрос, я также отправил вам сообщение в чате? пожалуйста, дайте мне знать, когда вы в следующий раз будете доступны. - person JackSparrow; 03.07.2012