Edit file teks saya untuk hanya menampilkan nilai tertinggi?

Saya menggunakan pengkodean berikut yang mengedit file teks saya berdasarkan nilai di kolom lebih kecil dari nilai di kotak teks.

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)

Sekarang pengkodean di atas berfungsi dengan sempurna, hasilnya terlihat seperti berikut:-

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

Apa yang saya harapkan adalah menambahkan pengkodean tambahan jadi saya hanya ingin String dengan angka tertinggi ditampilkan sehingga tampilan di atas akan terlihat seperti

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

Apakah mungkin untuk menambahkan sedikit pengkodean terakhir?

PEMBARUAN

Daripada memeriksa angka tertinggi dan menghapus bidang lainnya, saya ingin memeriksa setiap bidang yang cocok di kolom 1 dan memeriksa angka tertinggi dan jika lebih besar dari bidang di kotak teks1 maka hapus semua baris untuk bidang yang cocok di kolom 1. Jika angka tertinggi lebih rendah dari bidang di kotak teks1, lalu pertahankan baris itu tetapi hapus kolom 1 bidang lain yang cocok. Jadi misalnya

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

Jadi jika textbox1 memiliki 550 maka Anda harus memilikinya

String1 500
String2 256
String4 100
String5 492

Pembaruan 2

Nilai di textbox1 adalah

1341273599

Ketika saya hanya memfilter kolom untuk menampilkan kolom 1 dan kolom 2 saya mendapatkan yang berikut.

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

Jadi ketika saya menjalankan pengkodean sebenarnya saya mendapatkan yang berikut ini

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

Anda mungkin dapat melihat bahwa hasil akhirnya salah?


person JackSparrow    schedule 29.06.2012    source sumber


Jawaban (1)


Anda dapat menggunakan Kamus untuk menyimpan nilai:

    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
Hai Holger, apa yang kamu bicarakan? Tolong, saya bisa melakukannya dengan sedikit bantuan. Atau kita bisa membawanya untuk ngobrol? - person JackSparrow; 02.07.2012
comment
Oke, ayo kita ajak ngobrol. Beri tahu saya nama ruang obrolan. - person Holger Brandt; 02.07.2012
comment
Holger, maaf saya tidak bisa masuk ke obrolan karena dikatakan reputasi saya tidak cukup?? Saya akan mengedit posting pertama dan memberi tahu Anda masalah yang saya hadapi. - person JackSparrow; 02.07.2012
comment
Jadi, jika saya memahami pembaruan terbaru Anda, Anda mencari catatan pengguna yang tidak melebihi nilai yang ditentukan, dalam hal ini 550. Namun, bukankah String3 akan tetap mengembalikan 345? Saya sedikit bingung ketika melihat hasil Anda. - person Holger Brandt; 02.07.2012
comment
Hai, tidak, karena String3 memiliki 643 yang lebih tinggi dari 550. Jadi semua String yang lebih tinggi dari 550 Saya ingin menghapus grup yaitu String1, String2, String3 dan (seperti sebelumnya) hanya menampilkan nilai tertinggi dari yang kurang dari 550. - person JackSparrow; 02.07.2012
comment
Saya pikir saya mengerti. Saya memodifikasi bagian terakhir yang membuat string. Jika sebuah String lebih besar dari nilai Textbox1.Text, maka String tersebut tidak akan disertakan dalam string hasil. - person Holger Brandt; 02.07.2012
comment
Terima kasih Holger, saya telah mencoba pengkodean tetapi jika nilai di textbox1 lebih tinggi maka tidak menghapus semua baris yang cocok? - person JackSparrow; 02.07.2012
comment
mari kita melanjutkan diskusi ini di chat - person Holger Brandt; 02.07.2012
comment
Holger Saya punya pertanyaan singkat, saya juga sudah mengirim pesan kepada Anda melalui obrolan? tolong beri tahu saya kapan Anda tersedia berikutnya. - person JackSparrow; 03.07.2012