Lọc dữ liệu và gán chuỗi trước số thuê bao (1 người xem)

Liên hệ QC

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

tranvanthanh119

Thành viên chính thức
Tham gia
4/3/13
Bài viết
71
Được thích
51
Nghề nghiệp
Viễn Thông
Lọc dữ liệu và gán chuỗi trước số

Kính chào các thầy cô, anh chị trên diễn đàn. Tôi có dữ liệu ở file.txt và muốn dùng excel để lọc ra các số thuê bao ở trong "file chưa lọc" và gán chuỗi trước mỗi máy như ở trong "file đã lọc". Vì yêu cầu công việc của tôi cứ lặp đi lặp lại hàng tháng, mà chưa thể lọc tự động được nên nhiều khi rất vất vả.
Trong file có một số từ ngữ chuyên ngành tôi đã chú thích ở trong file.
Xin cảm ơn mọi người đã đọc bài và mong được giúp đỡ.
 
Lần chỉnh sửa cuối:
Kính chào các thầy cô, anh chị trên diễn đàn. Tôi có dữ liệu ở file.txt và muốn dùng excel để lọc ra các số thuê bao ở trong "file chưa lọc" và gán chuỗi trước mỗi máy như ở trong "file đã lọc". Vì yêu cầu công việc của tôi cứ lặp đi lặp lại hàng tháng, mà chưa thể lọc tự động được nên nhiều khi rất vất vả.
Trong file có một số từ ngữ chuyên ngành tôi đã chú thích ở trong file.
Xin cảm ơn mọi người đã đọc bài và mong được giúp đỡ.

Bạn dùng công cụ Import Data để nạp dữ liệu từ file TXT vào Excel. Xong dùng công cụ AutoFilter lọc ra cái bạn cần
 
Cảm ơn thầy ndu96081631 nhưng điều kiện lọc ở AutoFilter không cho ra được các cột số như trong file đã trình bày. Hơn nữa trong khi lọc mình phải cắt 2 chữ số đầu từ 9 ký tự xuống 7 ký tự và gán tex trước mỗi số.
Các điều kiện để nhận biết mỗi trạm là các ký hiệu ví dụ như: "!bth1"... như ở trong sheet2 vì sau khi mình lọc ra rồi thì phải tính được tổng số thuê bao của mỗi trạm đó. Điều kiện lọc này em chưa nhắc đến trong bài #1 vì sợ gây phức tạp và khó hiểu cho người giúp đỡ.
 
Kính chào các thầy cô, anh chị trên diễn đàn. Tôi có dữ liệu ở file.txt và muốn dùng excel để lọc ra các số thuê bao ở trong "file chưa lọc" và gán chuỗi trước mỗi máy như ở trong "file đã lọc". Vì yêu cầu công việc của tôi cứ lặp đi lặp lại hàng tháng, mà chưa thể lọc tự động được nên nhiều khi rất vất vả.
Trong file có một số từ ngữ chuyên ngành tôi đã chú thích ở trong file.
Xin cảm ơn mọi người đã đọc bài và mong được giúp đỡ.

Lâu lâu không viết code ----> sợ Quên , tập viết lại 1 đoạn code sau :(bạn test thử coi như thế nào ) :
[GPECODE=vb]
Sub GPE()
Dim Fso As New FileSystemObject, txtStr As TextStream, regx As New RegExp, Match As Object
Dim FileName$, strTmp$, Arr(), i&, ID$
On Error Resume Next
FileName = Application.GetOpenFilename()
If FileName <> "False" Then
ID = Application.InputBox("Input ID tram ; Vd : bth1", Type:=2)
With Fso.OpenTextFile(FileName)
strTmp = .ReadAll
.close
End With
With regx
.Global = True: .MultiLine = True
.Pattern = "<!" & ID & ";(\r\n|.)+?END"
If .Test(strTmp) Then
strTmp = .Execute(strTmp)(0)
.Pattern = "\d{9}"
Set Match = .Execute(strTmp)
ReDim Arr(0 To Match.Count, 1 To 1)
For i = 0 To Match.Count - 1
Arr(i, 1) = "n=" & Match(i) & ";"
Next
End If
End With
[A2].Resize(UBound(Arr, 1)) = Arr
End If
End Sub
[/GPECODE]

p/s : mở file đính kèm --> click vào Run code : --> chọn file "filechualoc.log",--> điền tên chạm vào hộp thoại inputbox : bth1 hoặc bth2...
 

File đính kèm

Lần chỉnh sửa cuối:
Cảm ơn thầy hungpecc1 rất nhiều. Code này rất gọn nhẹ hơn yêu cầu đặt ra và đã giải quyết rất tốt cho công việc. Tuy nhiên thầy có thể chỉ thêm cách làm thế nào để thêm ký hiệu tên trạm vào cell A1 vd: bth1.
 
Cảm ơn thầy hungpecc1 rất nhiều. Code này rất gọn nhẹ hơn yêu cầu đặt ra và đã giải quyết rất tốt cho công việc. Tuy nhiên thầy có thể chỉ thêm cách làm thế nào để thêm ký hiệu tên trạm vào cell A1 vd: bth1.

* Bỏ chữ "thầy" trước tên hungpecc1 đi bạn nhé, ! chỉ là bạn bè ,thành viên giúp nhau thôi, mình chưa đủ trình làm "thầy", bạn gọi thế mình tổn thọ lắm !
* Nếu tại ô A1 : bạn có tên trạm là bth1 --> thì sửa dòng code :
PHP:
ID= Application.inputbox(...)
thành
PHP:
ID = range("A1")

*
 
Lần chỉnh sửa cuối:
Một chữ cũng là thầy. Bạn bè cũng là thầy gọi thế không sai đâu, nếu thấy ngại thì gọi là bạn bè vậy nhé.
Tuy nhiên do trình độ kém hay sao mà tôi lại không ráp được vô cái code này nhỉ?
PHP:
ID = Range("A1")("Input ID tram ; Vd : bth1", Type:=2)
 
Một chữ cũng là thầy. Bạn bè cũng là thầy gọi thế không sai đâu, nếu thấy ngại thì gọi là bạn bè vậy nhé.
Tuy nhiên do trình độ kém hay sao mà tôi lại không ráp được vô cái code này nhỉ?
PHP:
ID = Range("A1")("Input ID tram ; Vd : bth1", Type:=2)

code dòng ID chỉ "ngắn" thế này thôi bạn ah, không có dòng ("input.....") đâu:
PHP:
ID = Range("A1")
 
Một chữ cũng là thầy. Bạn bè cũng là thầy gọi thế không sai đâu, nếu thấy ngại thì gọi là bạn bè vậy nhé.
Tuy nhiên do trình độ kém hay sao mà tôi lại không ráp được vô cái code này nhỉ?
PHP:
ID = Range("A1")("Input ID tram ; Vd : bth1", Type:=2)
Theo em anh phải sửa toàn bộ dòng thứ 7 của code ở bài #4 thành ID = range("A1")
thì code mới chạy được.
 
Code chạy nhưng sao không lọc được như ban đầu nhỉ.
 
Code chạy nhưng sao không lọc được như ban đầu nhỉ.

Các bạn dùng, đọc tiếng Việt thật lạ. Người Việt mà đọc tiếng Việt không hiểu sao?

Trong bài #5 bạn viết:
chỉ thêm cách làm thế nào để thêm ký hiệu tên trạm vào cell A1 vd: bth1

Tôi hiểu là "thêm, nhập ký hiệu tên tram, tức ID vào cell A1"

Nếu ý bạn là:
1. Thay vì nhập ID vào InputBox thì lấy nó từ cell A1.
Thì bạn diễn đạt sai. Lấy từ A1 chứ không phải thêm vào. Mà lúc đó thì bạn đã phải có ký hiệu tên trạm ở A1 rồi. Không có thì lấy ở đâu ra?

2. Nếu ý bạn như tôi hiểu trên thì
hungpecc1 không hiểu tiếng Việt.
 
Lần chỉnh sửa cuối:
Các bạn dùng, đọc tiếng Việt thật lạ. Người Việt mà đọc tiếng Việt không hiểu sao?

Trong bài #5 bạn viết:


Tôi hiểu là "thêm, nhập ký hiệu tên tram, tức ID vào cell A1"

Nếu ý bạn là:
1. Thay vì nhập ID vào InputBox thì lấy nó từ cell A1.
Thì bạn diễn đạt sai. Lấy từ A1 chứ không phải thêm vào. Mà lúc đó thì bạn đã phải có ký hiệu tên trạm ở A1 rồi. Không có thì lấy ở đâu ra?

2. Nếu ý bạn như tôi hiểu trên thì
hungpecc1 không hiểu tiếng Việt.

Anh nặng lời quá ! lỗi là do em "cẩu thả" không đọc kỹ câu hỏi của bạn thôi mà ! chứ em vẫn biết tiếng việt anh ah!
 
Code chạy nhưng sao không lọc được như ban đầu nhỉ.

Mình không đọc kỹ yêu cầu của bạn nên có sự nhầm lẫn :-->
*Giữa nguyên code bạn đầu:
Thêm đoạn code vào như sau :
Mã:
[COLOR=#ff0000][B]range("A1") = ID  '<------- thêm dòng này vào code cũ [/B][/COLOR]
[I][A2].resize(Ubound(Arr,1)) = Arr[/I]
 
Thực ra Thầy siwtom chỉ trêu vậy thôi. Bài tôi đưa lên với ĐK tôi nghĩ là hơi phức tạp và khó diễn đạt, hoặc là do trình độ tôi vẫn đang còn hạn chế. Vậy mà bạn làm vèo một cái là xong. Cảm ơn bạn rất nhiều,
 
Mình không đọc kỹ yêu cầu của bạn nên có sự nhầm lẫn :-->
*Giữa nguyên code bạn đầu:
Thêm đoạn code vào như sau :
Mã:
[COLOR=#ff0000][B]range("A1") = ID  '<------- thêm dòng này vào code cũ [/B][/COLOR]
[I][A2].resize(Ubound(Arr,1)) = Arr[/I]
Cho mình hỏi:
1. Mình ráp code này vào mà vẫn không hiện dòng ID của trạm lên cell 1 nhỉ, vd: "!bth1;"
2. Không cắt được 2 chữ số đầu tiên khi "run code" vì chỉ lấy 7 chữ số-----> Không dám vọc vô code.
3. Mình muốn nó đếm tổng số thuê bao của mỗi trạm có được không?
 
Vẫn câu hỏi ở bài #15 và tôi muốn lọc thêm các đầu số ở mỗi trạm thì dùng cú pháp gì xin được mọi người hướng dẫn.
VD: "bth1" có những đầu số nào thì mình thống kê ở những cột bên cạnh. Tôi đã thử lọc bằng Advanced Filter nhưng mà không được như ý muốn. Xin được giúp đỡ.
 
Cảm ơn thầy hungpecc1 rất nhiều. Code này rất gọn nhẹ hơn yêu cầu đặt ra và đã giải quyết rất tốt cho công việc. Tuy nhiên thầy có thể chỉ thêm cách làm thế nào để thêm ký hiệu tên trạm vào cell A1 vd: bth1.

1. Dữ liệu của bạn chưa chuẩn. Tôi hiểu là mỗi trạm bắt đầu từ <!xyz; và kết thúc bằng END. Nhưng bạn có 58 END trong khi chỉ có 44 <!xyz;
Ví dụ bạn mở tập tin và tìm <stdep:DEV=LIMA-69120&&-69659;
Tram này không có dòng <!xyz;

2. Tôi không hiểu bạn muốn nhập ID vào A1 để làm gì. Nhìn cột B thì thấy các trạm được liệt kê trong cột B trong cùng 1 sheet1. Có 44 trạm mà chỉ có 1 ô A1 trong sheet1. Vậy thì thế nào đây?

3. Tôi thử làm. Tật cả các trạm tôi cho hết vào cột A. Các trạm cách nhau 1 dòng trống. Bạn chỉ mở tập tin LOG, code sẽ tự tìm hết các trạm thỏa <!xyz; ... END (hiện bạn có dữ liệu chưa chuẩn)

4. Mở tập tin Excel --> nhấn nút DoSomething --> chọn tập tin LOG
Mã:
Sub DoSomething()
    Dim fso As Object, re As Object, Match As Object, oMatches As Object, r As Long, count As Long
    Dim FileName, Arr() As String, i As Long, s As String, result() As String
        FileName = Application.GetOpenFilename()
        If FileName <> "False" Then
            Set fso = CreateObject("Scripting.FileSystemObject")
            With fso.OpenTextFile(FileName)
                s = .ReadAll
                .Close
            End With
            Set fso = Nothing
            
            Set re = CreateObject("VBScript.RegExp")
            With re
                .Global = True
                .Pattern = "<(!.+;)(?:\n|.)+?END"
                Set Match = .Execute(s)
                If Not Match Is Nothing Then
                    ReDim Arr(1 To 1)
                    .Pattern = "\s\d{2}(\d{7})\s"
                    For i = 0 To Match.count - 1
                        Set oMatches = .Execute(Match(i))
                        If Not oMatches Is Nothing Then
                            ReDim Preserve Arr(1 To count + 2 + oMatches.count)
                            count = count + 1
                            Arr(count) = Match(i).SubMatches(0)
                            For r = 0 To oMatches.count - 1
                                count = count + 1
                                Arr(count) = "n=" & oMatches(r).SubMatches(0) & ";"
                            Next r
                            count = count + 1
                        End If
                        Set oMatches = Nothing
                    Next
                End If
                Set Match = Nothing
            End With
            Set re = Nothing
            
            If count Then
                ReDim result(1 To count - 1, 1 To 1)
                For r = 1 To count - 1
                    result(r, 1) = Arr(r)
                Next r
                [A1].Resize(UBound(result)) = result
            End If
        End If
End Sub
 

File đính kèm

1. Dữ liệu của bạn chưa chuẩn. Tôi hiểu là mỗi trạm bắt đầu từ <!xyz; và kết thúc bằng END. Nhưng bạn có 58 END trong khi chỉ có 44 <!xyz;
Ví dụ bạn mở tập tin và tìm <stdep:DEV=LIMA-69120&&-69659;
Tram này không có dòng <!xyz;

2. Tôi không hiểu bạn muốn nhập ID vào A1 để làm gì. Nhìn cột B thì thấy các trạm được liệt kê trong cột B trong cùng 1 sheet1. Có 44 trạm mà chỉ có 1 ô A1 trong sheet1. Vậy thì thế nào đây?

3. Tôi thử làm. Tật cả các trạm tôi cho hết vào cột A. Các trạm cách nhau 1 dòng trống. Bạn chỉ mở tập tin LOG, code sẽ tự tìm hết các trạm thỏa <!xyz; ... END (hiện bạn có dữ liệu chưa chuẩn)

4. Mở tập tin Excel --> nhấn nút DoSomething --> chọn tập tin LOG
Dạ, em cảm ơn thầy đã nhắc nhở. Em không lường trước được dữ liệu đưa ra khi hỏi bài trên diễn đàn. Thực chất mỗi trạm <!xyz; lại có rất nhiều <stdep:DEV=LIMA-xxx&&-xxx; dữ liệu em đưa lên mới chỉ một phần mà thôi. Theo code của thầy và bạn hungpecc1 bây giờ em mới hiểu được quy luật, tức là thoả đk: <!xyz; ... END. Vậy thì em có thể thêm trước các <stdep:DEV=LIMA-xxx&&-xxx; mỗi <!xyz; để code chạy đúng quy luật của nó. Và em đã làm xong.
Em muốn nhập ID như vậy mục đích để thống kê cho dễ. Sau khi có file chuẩn rồi, đưa log vào chạy trong tổng đài và lấy log ra tiếp tục thống kê lần 2. Ở bài hỏi sau ạ.
 
Lọc dữ liệu và thống kê (phần 2)

Sau khi được sự trợ giúp của mọi người ở bài #1 tôi đã hoàn thành được bước một công việc của mình.
Để khỏi loãng topic tôi xin gửi lên đây dữ liệu tiếp theo mà trước đó thầy siwtom và bạn hungpecc1 đã giúp tôi hoàn thành
Vì dữ liệu lần này lớn hơn nên tôi chỉ lấy ID của 4 trạm "<!bth1;<!bth2;<!bth3;<!cdc1;".
Yêu cầu lọc dữ liệu như sau:
1.Thống kê bằng excel ở cột bên cạnh trạm bth1,bth2... có bao nhiêu số thuê bao?
2.Thống kê có bao nhiêu dịch vụ tbo-1 và tbo-2 ở trong trạm đó.
Mong mọi người hướng dẫn và trợ giúp. Xin cảm ơn.
Sau đây là file đính kèm:
 

File đính kèm

Dạ, em cảm ơn thầy đã nhắc nhở. Em không lường trước được dữ liệu đưa ra khi hỏi bài trên diễn đàn. Thực chất mỗi trạm <!xyz; lại có rất nhiều <stdep:DEV=LIMA-xxx&&-xxx; dữ liệu em đưa lên mới chỉ một phần mà thôi. Theo code của thầy và bạn hungpecc1 bây giờ em mới hiểu được quy luật, tức là thoả đk: <!xyz; ... END. Vậy thì em có thể thêm trước các <stdep:DEV=LIMA-xxx&&-xxx; mỗi<!xyz; để code chạy đúng quy luật của nó. Và em đã làm xong.
Em muốn nhập ID như vậy mục đích để thống kê cho dễ. Sau khi có file chuẩn rồi, đưa log vào chạy trong tổng đài và lấy log ra tiếp tục thống kê lần 2. Ở bài hỏi sau ạ.

Thế thì tôi chả hiểu nữa. Cấu trúc dữ liệu của bạn thế nào thì tự bạn phải biết chứ sao lại tôi nói như thế nào thì bạn cũng "gật"? Tôi chỉ đoán là mỗi trạm bắt đầu bằng <!xyz; và kết thúc bằng END. Còn thực sự cấu trúc thế nào thì bạn phải nói cho tôi biết chứ?

Nhìn vào dữ liệu ở bài #19 thì tôi bó tay rồi. Trước đó tôi nghĩ là mỗi trạm bắt đầu bằng <!xyz; và khi gặp END thì kết thúc trạm đó. Nhưng xem dữ liệu ở bài #19 thì sau <!bth1; có hàng trăm END

Bài #19 là bài hoàn toàn khác?
 
Web KT

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

Back
Top Bottom