2012-06-29 7 views
0

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

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 

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

UPDATE

Вместо того, чтобы проверять наибольшее количество и удаление других полей, я хочу, чтобы проверить каждое поле соответствия в колонке 1 и проверьте, наибольшее число и, если его больше, чем поле в TextBox1 затем удалить все строки для соответствующих полей в столбце 1. Если наибольшее число меньше, чем поле в текстовом поле 1, сохраните эту строку, но удалите другие соответствующие поля столбца 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 

Update 2

Значение в TextBox1 является

1341273599 

Когда я только фильтровать столбцы для отображения столбца 1 и столбца 2 I g et the following.

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 

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

ответ

3

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

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) 
+0

Привет Holger ты о? Я мог бы сделать с небольшой помощью, пожалуйста. Или мы могли бы поговорить с ним? – JackSparrow

+0

Конечно, давайте поговорим. Позвольте мне узнать название чата. –

+0

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

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