Nhờ các bạn giúp mình cách lọc bớt dữ liệu gần giống nhau (2 người xem)

Liên hệ QC

Người dùng đang xem chủ đề này

minharsenal

Thành viên mới
Tham gia
14/2/11
Bài viết
15
Được thích
0
Chào các bạn,
Mình có cái bảng như sau:


Ví dụ như 2 giá trị bôi vàng là gần như giống nhau, chỉ khác nhau một chút xíu ở phần thời gian (chênh nhau 1s)
Bây giờ mình muốn lọc tự động, xoá bớt đi các giá trị gần giống nhau như thế, điều kiện xoá là giá trị thời gian chênh nhau dưới 30s.
Cám ơn các bạn!
File mình gửi đính kèm.
 

File đính kèm

Mình thử mần bài này không dùng Dic, kết quả ra cũng tá lả
PHP:
Sub ABC()
Dim nguon(), kq(1 To 10000, 1 To 5), I, J, K, A, B, C, t1, t2
Range([A2], [E65536].End(3)).Sort [A1], , [C1]
nguon = Range([A2], [E65536].End(3)).Value
K = 1: C = 30
For J = 1 To 5:    kq(1, J) = nguon(1, J): Next
For I = 2 To UBound(nguon)
    If nguon(I, 1) = nguon(I - 1, 1) Then
        If nguon(I, 2) = nguon(I - 1, 2) Then
            t1 = kq(K, 3): t2 = nguon(I, 3)
            A = Hour(t1) * 3600 + Minute(t1) * 60 + Second(t1)
            B = Hour(t2) * 3600 + Minute(t2) * 60 + Second(t2)
            If B - A > C Then
                K = K + 1
                For J = 1 To 5: kq(K, J) = nguon(I, J): Next
            End If
        End If
    Else
        K = K + 1
        For J = 1 To 5: kq(K, J) = nguon(I, J): Next
    End If
Next
[F2].Resize(K, 5) = kq
End Sub

Trong code trên, C là một hằng số mặc định. Nếu đặt thẳng nó là Const thì người đọc code sẽ hiểu ngay nhiệm vụ của nó.

Mạn phép cải tiến code:

Sub ABC()
Const SAISO As Double = 30 / 24 / 3600 ' tức là 30 giây
...
' If B - A > C Then ' sửa thành
If t2 - t1 > SAISO Then

bỏ luôn không cần tính đến A, B, C

@Ba Tê:
Round(sArr(I, 3), 2) * 100
Nếu số lẻ thứ 3 là số 5, và số lẻ thứ 2 là số chẵn thì code có thể có vấn đề:
Round(0.1250001, 2) * 100 = 13 ; vấn đề vì 2 là số chẵn
Round(0.1250000, 2) * 100 = 12
Round(0.1350001, 2) * 100 = 14 ; không sao vì 3 là số lẻ
Round(0.1350000, 2) * 100 = 14
Sử dụng hàm Round nó hơi rắc rối một chút.

Tuy nhiên, phải nhìn nhận giải pháp ép số vào Dictionary rất độc đáo, bởi vì nó không phải sort bảng. Vấn đề chỉ là tìm con toán ép số cho chính xác thôi.
 
Lần chỉnh sửa cuối:
Upvote 0
Mình thử mần bài này không dùng Dic, kết quả ra cũng tá lả
PHP:
Sub ABC()
Dim nguon(), kq(1 To 10000, 1 To 5), I, J, K, A, B, C, t1, t2
Range([A2], [E65536].End(3)).Sort [A1], , [C1]
nguon = Range([A2], [E65536].End(3)).Value
K = 1: C = 30
For J = 1 To 5:    kq(1, J) = nguon(1, J): Next
For I = 2 To UBound(nguon)
    If nguon(I, 1) = nguon(I - 1, 1) Then
        If nguon(I, 2) = nguon(I - 1, 2) Then
            t1 = kq(K, 3): t2 = nguon(I, 3)
            A = Hour(t1) * 3600 + Minute(t1) * 60 + Second(t1)
            B = Hour(t2) * 3600 + Minute(t2) * 60 + Second(t2)
            If B - A > C Then
                K = K + 1
                For J = 1 To 5: kq(K, J) = nguon(I, J): Next
            End If
        End If
    Else
        K = K + 1
        For J = 1 To 5: kq(K, J) = nguon(I, J): Next
    End If
Next
[F2].Resize(K, 5) = kq
End Sub

Bạn thay đoạn
Mã:
[COLOR=#ff0000]A = Hour(t1) * 3600 + Minute(t1) * 60 + Second(t1)
            B = Hour(t2) * 3600 + Minute(t2) * 60 + Second(t2)
            If B - A > C Then[/COLOR]
thành
Mã:
[COLOR=#ff0000]If (t2-t1)*86400 > C Then[/COLOR]
cho nó chuyên nghiệp
 
Lần chỉnh sửa cuối:
Upvote 0
Bạn thay đoạn
Mã:
[COLOR=#ff0000]A = Hour(t1) * 3600 + Minute(t1) * 60 + Second(t1)
            B = Hour(t2) * 3600 + Minute(t2) * 60 + Second(t2)
            If B - A > C Then[/COLOR]
thành
Mã:
[COLOR=#ff0000]If (t2-t1)*86400 > C Then[/COLOR]
cho nó chuyên nghiệp

Cứ mỗi dòng lại phải nhân cho 86400 ? Đem chia C cho nó trước phải tiện hơn không ?
Số trong hệ thống chính xác được đến đơn vị thứ 15. Không sợ chia sẽ làm mất chính xác.
 
Upvote 0
Em gà cái món lập trình này quá, chỉ đọc thôi cũng hoa hết cả mắt :( Cám ơn các bác rất nhiệt tình giúp đỡ e :3
 
Upvote 0
Web KT

Bài viết mới nhất

Back
Top Bottom