TÁCH ĐOẠN CHỮ SỐ TRONG ĐOẠN TEXT

Liên hệ QC

quanloc

Thành viên mới
Tham gia
18/7/07
Bài viết
27
Được thích
3
tôi có 1 file dữ liệu như mẫu dưới đây, Điều tôi cần là tách những số phần đầu ra bằng 1 câu lệnh
Đây là dữ liệu rất lớn, có thể lên đến hàng 100 ngàn dữ liệu.
Dữ liệu không có cùng 1 format ngăn cách giữa những số đầu cần lấy ra và những chữ kế tiếp của nó.
Ngoài ra có thể trước số cần lấy ra lại có những ký tự khác
VD : 156-6784352OTO TAI BEN DAEWOO 13
Số cần lấy ra là : 6784352

Rất mong các bạn chỉ giáo hộ
Thanks !

6784352-OTO TAI BEN DAEWOO 24
156-6784352OTO TAI BEN DAEWOO 13
1214154;HAI MAY PHAY H.SHODA, 1 H.HEIAN
2870081_QSDD 36-79-CTY BAOLINH-40 TY
342-1193941-MAYNENKHI AIRMAN PDS390-BINHDINH
1193941.XILO CHUA BEN-CTY BINH DINH
1193941-MAYNENKHI AIRMAN PDSF390S-BINHDI
3733269 CHCC PETROVIETNAM LANDMARK
2701405-132-NHA 22 NGUYEN DINH CHI
2701405@132-117A TAN HOA DONG
989385*132-35ACCNGUYEN THI NHO, P15, Q11
989385-132-NHA NGUYEN THIEN THUAT, Q3
989385[132-XE MITSUBISHI SDK 010171
989385b132-XE MITSUBISHI SDK 001420
989385^132-XE MITSUBISHI SDK 009823
989385-132-XE MITSUBISHI SO DK 026679
 
tôi có 1 file dữ liệu như mẫu dưới đây, Điều tôi cần là tách những số phần đầu ra bằng 1 câu lệnh
Đây là dữ liệu rất lớn, có thể lên đến hàng 100 ngàn dữ liệu.
Dữ liệu không có cùng 1 format ngăn cách giữa những số đầu cần lấy ra và những chữ kế tiếp của nó.
Ngoài ra có thể trước số cần lấy ra lại có những ký tự khác
VD : 156-6784352OTO TAI BEN DAEWOO 13
Số cần lấy ra là : 6784352

Rất mong các bạn chỉ giáo hộ
Thanks !

6784352-OTO TAI BEN DAEWOO 24
156-6784352OTO TAI BEN DAEWOO 13
1214154;HAI MAY PHAY H.SHODA, 1 H.HEIAN
2870081_QSDD 36-79-CTY BAOLINH-40 TY
342-1193941-MAYNENKHI AIRMAN PDS390-BINHDINH
1193941.XILO CHUA BEN-CTY BINH DINH
1193941-MAYNENKHI AIRMAN PDSF390S-BINHDI
3733269 CHCC PETROVIETNAM LANDMARK
2701405-132-NHA 22 NGUYEN DINH CHI
2701405@132-117A TAN HOA DONG
989385*132-35ACCNGUYEN THI NHO, P15, Q11
989385-132-NHA NGUYEN THIEN THUAT, Q3
989385[132-XE MITSUBISHI SDK 010171
989385b132-XE MITSUBISHI SDK 001420
989385^132-XE MITSUBISHI SDK 009823
989385-132-XE MITSUBISHI SO DK 026679
Số bạn cần lấy có bao nhiêu chữ số!!!
 


với dữ liệu dưới đây thì công thức của bạn không còn đúng nữa.
và nhớ điều kiện là chỉ 1 dòng công thức, không làm thêm bất cứ cột nào
53485-THE TIET KIEM CO KY HAN
53421-CC 180A NGUYEN TRI PHUONG, P9, Q5
62835 QSD 3327/DCND(QUAN DAT)
62429 NHA XUONG - DELTA
58739;STK CO KY HAN 130203-PQH3
58739,STK CO KY HAN 130204-PQH3
94178.DCSXLON2MANH_MAYIN_DCCATSAT_XENANG
95203-1 MAY IN OFFSET 4 MAU
94229 - QUYENSUDUNGDAT
94178DAY CHUYEN TRANG VERNI TREN SAT
94178@MAY DAP NAP & CUON VANH NAP LON
93099*8MMTB(3TRANGMEN,650,350,100MAY PHA
93099-NHAXUONG VAN PHONG
93099-MAY THU DONG
94178-THIET BI LAM HOP VUONG KIM LOAI
95203-2 NHA O SO 396 TRAN HUNG DAO Q5
93038-DC MAY THI NGHIEM, PHAT DIEN, GUON
93059-11 TO HOP MAY HAN TU DONG
 
Số bạn cần lấy có bao nhiêu chữ số!!!

Tùy theo dòng dữ liệu, có thể là 4 số, có thể là 5, có thể là 6 và cũng có thể là 7 và 8
Những số đó là ID của khách hàng. Mình cần tách riêng ra để sử dụng cho công việc khác

Thấy câu lệnh của bạn hay quá ha. Nhưng không đúng theo yêu cầu và tôi cũng
không hiểu câu lệnh của bạn
Rất mong được bạn giải thích ý nghĩa từng cú pháp .
Thanks bạn rất nhiều
 

File đính kèm

  • CIF khach hang vay 4.xlsx
    10.4 KB · Đọc: 9
Chỉnh sửa lần cuối bởi điều hành viên:
Thế nào gọi là "mẫu"????

Vậy thì cách 2 đó!!!!!!!!!!!! (nếu không tự chỉnh được công thức 1).

đã nói là : dữ liệu có thể lên đến hàng 100.000 hàng, phần dữ liệu tôi mới đưa lên sau là 1 phần tiếp theo dữ liệu đầu
Do đó, cần là cần 1 công thức tổng quát, giải quyết được mọi trường hợp dữ liệu, dù thay đổi các kiểu
thanks bạn nhiều

Thế nào gọi là "mẫu"????

Vậy thì cách 2 đó!!!!!!!!!!!! (nếu không tự chỉnh được công thức 1).

Dữ liệu rất lớn, và không chỉ 1 cấu trúc như dữ liệu đã gửi, phần dữ liệu mới đưa lên là phần tiếp theo của nó đó
 
Chỉnh sửa lần cuối bởi điều hành viên:
Tôi có sử dụng hàm :
Bạn vui lòng tích hợp công nghệ AI nha :)


Tôi có dùng một đoạn code viết hàm ExtractNumber
như sau :
Function ExtractNuber(rCell As Range)
Dim lCount As Long
Dim sText As String
Dim lNum As String
sText = rCell
For lCount = Len(sText) To 1 Step -1
IfNum = Mid(sText, lCount, 1) & lNum
End If
Next lCount
ExtractNumer = Clng(lNum)
End Function

Tuy nhiên với đoạn code này nó lấy ra toàn bộ số có trong dữ liệu
mà ở đây mình chỉ cần lấy chuỗi số liền nhau đầu tiên có từ 5 ký tự trở lên .
Nếu đoạn đầu của TEXT có 03 chữ số thì bỏ đi và tìm tiếp chuỗi chữ số tiếp theo có 5 đến 9 chữ số
để lấy ra, tách ra.
 
Thấy câu lệnh của bạn hay quá ha. Nhưng không đúng theo yêu cầu và tôi cũng
không hiểu câu lệnh của bạn
Rất mong được bạn giải thích ý nghĩa từng cú pháp .
Thanks bạn rất nhiều
Với File này bạn dùng:
PHP:
Sub abc()
    Dim LR As Long, i As Long
    LR = Range("A" & Rows.Count).End(xlUp).Row
    For i = 2 To LR
         Range("A" & i) = Replace(Replace(Replace(Replace(Replace(Replace(Replace(Range("A" & i), "*", " "), ";", " "), ".", " "), "*", " "), "@", " "), "-", " "), ",", " ")
         Range("C" & i) = Split(Range("A" & i), " ")(0)
    Next i
    Columns(3).Replace "DAY", ""
End Sub
 
Bạn biết code, thì tự tìm cách vận dụng nó. Mình chỉ giúp vậy thôi.
Find: ((.*[^\d].*)|^)(?<dangnhovaday>\d{4}\d*)(.*)?
Replace: ${dangnhovaday}
 
Lần chỉnh sửa cuối:
Nếu xử lý 100.000 dòng trên excel bằng công thức rất phức tạp.
Mình xử lý 557.056 dòng bằng dang text chỉ xử lý mất có 1 phút. Vấn đề ở chỗ biết cách xử lý sao thôi.

Bước 1. Xóa hết toàn bộ dữ liệu phía sau phần phát hiện ra >=5 ký tự đầu tiên.
(?<clearlast>\d{5}\d*)(.*)?
${clearlast}

Bước 2: Xóa hết phần không phải chữ ố trước và sau ký tự phía sau phần
(.*[^\d])(?<clearfirst>\d*\d{5}[^\d]$)
${clearfirst}

Mình chỉ góp ý với thớt là, bạn đang nhờ người khác giúp, nên giữ thái độ một chút. Nếu bạn không biết cách thì với 100.000 dữ liệu bạn xử lý tay vài tháng cũng nên. Với dữ liệu phức tạp như bạn bảo thì không cover hết được trường hợp rủi ro, thì bạn phải hiểu nên lấy mẫu sao để mọi người tìm cách xử lý, thay vì bảo abc, xyz sao đó.

MT.
 

File đính kèm

  • getdata_step1.png
    getdata_step1.png
    185.8 KB · Đọc: 13
Nếu xử lý 100.000 dòng trên excel bằng công thức rất phức tạp.
Mình xử lý 557.056 dòng bằng dang text chỉ xử lý mất có 1 phút. Vấn đề ở chỗ biết cách xử lý sao thôi.

Bước 1. Xóa hết toàn bộ dữ liệu phía sau phần phát hiện ra >=5 ký tự đầu tiên.
(?<clearlast>\d{5}\d*)(.*)?
${clearlast}

Bước 2: Xóa hết phần không phải chữ ố trước và sau ký tự phía sau phần
(.*[^\d])(?<clearfirst>\d*\d{5}[^\d]$)
${clearfirst}

Mình chỉ góp ý với thớt là, bạn đang nhờ người khác giúp, nên giữ thái độ một chút. Nếu bạn không biết cách thì với 100.000 dữ liệu bạn xử lý tay vài tháng cũng nên. Với dữ liệu phức tạp như bạn bảo thì không cover hết được trường hợp rủi ro, thì bạn phải hiểu nên lấy mẫu sao để mọi người tìm cách xử lý, thay vì bảo abc, xyz sao đó.

MT.
Bạn làm ơn cho tôi hỏi phần mềm Sakura 2.2.0.1 là phầm mềm gì? Cách sử dụng ra sao?
Xin cảm ơn bạn.
 
Bạn làm ơn cho tôi hỏi phần mềm Sakura 2.2.0.1 là phầm mềm gì? Cách sử dụng ra sao?
Xin cảm ơn bạn.
Nó là phần mềm editor như notepad, sublime text, vim... thôi bạn. Sử dụng cũng như các công cụ đó, còn chắc cái bạn quan tâm là regex. Cái này mỗi ngôn ngữ lập trình có cách viết regex riêng, như sublime text dùng perl thì mình phải mò lại cách viết nó, hay regex trong sakura phải chế lại mới dùng đc trong vba vậy. Muốn biết thì lăn vào search đọc cho biết, thích thì mò không thì bỏ cho nhẹ đầu.

Nếu bạn muốn tìm hiểu về regex trong sakura thì đọc bên dưới (dùng google dich nếu không biết tiếng nhật)
http://sakura-editor.sourceforge.net/htmlhelp/HLP000089.html
http://sakura-editor.sourceforge.net/htmlhelp/HLP000006.html
 
Lần chỉnh sửa cuối:
Với File này bạn dùng:
PHP:
Sub abc()
    Dim LR As Long, i As Long
    LR = Range("A" & Rows.Count).End(xlUp).Row
    For i = 2 To LR
         Range("A" & i) = Replace(Replace(Replace(Replace(Replace(Replace(Replace(Range("A" & i), "*", " "), ";", " "), ".", " "), "*", " "), "@", " "), "-", " "), ",", " ")
         Range("C" & i) = Split(Range("A" & i), " ")(0)
    Next i
    Columns(3).Replace "DAY", ""
End Sub


cái này là code của marco hay là add in vậy bạn. Giờ dùng đoạn code này tạo marco hả bạn ?
 
Số cần lấy là mã khách hàng, đoạn số mà mình đã ví dụ. nó thường có từ 4 đến 7 chữ số, rất ít khi, nhưng có lúc nó 8 chữ số là cao nhất.
Tưởng đâu bạn làm được rồi, dùng code này:
PHP:
Sub idcustomer()
Dim i As Long, arr, result
arr = Range("a1:a" & Cells(Rows.Count, "A").End(xlUp).Row)
ReDim result(1 To UBound(arr), 1 To 1)
With CreateObject("vbscript.regexp")
    .Pattern = "\d{4,8}"
    For i = 1 To UBound(arr)
        result(i, 1) = .Execute(arr(i, 1))(0)
    Next i
End With
[b1].Resize(UBound(arr)) = result
End Sub
 

File đính kèm

  • Book1.xlsb
    17.1 KB · Đọc: 20
Tưởng đâu bạn làm được rồi, dùng code này:
PHP:
Sub idcustomer()
Dim i As Long, arr, result
arr = Range("a1:a" & Cells(Rows.Count, "A").End(xlUp).Row)
ReDim result(1 To UBound(arr), 1 To 1)
With CreateObject("vbscript.regexp")
    .Pattern = "\d{4,8}"
    For i = 1 To UBound(arr)
        result(i, 1) = .Execute(arr(i, 1))(0)
    Next i
End With
[b1].Resize(UBound(arr)) = result
End Sub
Biến nó thành array để index là một cách hay. Mình dùng sakura hạn chế không xài đc vòng lặp, đưa vào vbe sẽ xử lý dễ hơn.
 
Tưởng đâu bạn làm được rồi, dùng code này:
PHP:
Sub idcustomer()
Dim i As Long, arr, result
arr = Range("a1:a" & Cells(Rows.Count, "A").End(xlUp).Row)
ReDim result(1 To UBound(arr), 1 To 1)
With CreateObject("vbscript.regexp")
    .Pattern = "\d{4,8}"
    For i = 1 To UBound(arr)
        result(i, 1) = .Execute(arr(i, 1))(0)
    Next i
End With
[b1].Resize(UBound(arr)) = result
End Sub

Tôi rất cảm ơn bạn, tôi thấy nó bóc tách ID của khách hàng rất chính xác.
Nhưng hình như nó có 2 lỗi :
1- nếu ô đầu tiên của hàng đầu không có cấu trúc như dữ liệu hoặc trống, hoặc nhãn của cột thì nó không chạy và báo lỗi.
2- Nếu dữ liệu quá lớn, ví dụ như dữ liệu lên đến 35 ngàn dòng thì nó cũng báo lỗi và không chạy được.
Tôi cũng không chắc là bao nhiêu thì nó báo lỗi, nhưng tôi đã làm đến 2000 dữ liệu thì thấy nó vẫn chạy tốt, ngoại trừ lỗi 1.
Ước gì bạn cố công thêm 1 tý giúp tôi cho trót luôn nhé
Cảm ơn bạn quá sức nhiều ! 'thanks thanks thanks thanks thanks thanks thanks thanks thanks thanks
 
Web KT
Back
Top Bottom