Tách dữ liệu từ chuỗi text

Liên hệ QC
Tôi tuân thủ nội quy khi đăng bài
Dạ, mong bác chia sẻ ạ. Em tìm hiểu vì sở thích, nên mấy cái này hứng thú lắm.
Thì cứ viết ra giấy thử xem. Trên nguyên tắc, đệ quy dùng để thay thế các đoạn code cần vòng lặp cho các ngôn ngữ không có lòng lặp.
Đặt là hàm TIMCHUOI với tham số: (i) chuỗi cần lọc
1. Nếu len chuỗi cần lọc < 8 thì trả về ""
2. Nếu không thì nhét một dấu " " vào trước nó.
3. Kế đó là tìm chuỗi " 103" trong left chuỗi -9
3. Nếu không có kết quả thì
3. Tìm xem thằng thứ chín sau chỗ có phải là trống hoặc không có thằng thứ chín
3.1. Nếu 5 thằng kế là số thì đã tìm ra, trải chuốt và trả về kết quả.
3.2. Chưa tìm được, chạy tiếp
4. Gọi TIMCHUOI(chuỗi kể từ chỗ đã tìm kia + 4)

Nếu dùng 2 hàm thì dễ hơn một chút:
Hàm TIMCHUOI gọi hàm TIMCHUOI2 hàm thứ nhất dọn data thành mảng, hàm thứ hai duyệt mảng theo đường lối đệ quy. Tức là xét phần tử đầu, nếu đạt thì trả về kết quả, nếu không thì gọi đệ quy với mảng đã bỏ đi phần tử đầu.
TIMCHUOI(du lieu):
trả về TIMCHUOI2(TextSplit(TRIM(du lieu), " "))

TIMCHUOI2(duLieu)
IF duLieu(1) thỏa return duLieu đã chải chuốt lại
ELSE TIMCHUOI2(DROP(duLieu, 1))
 
Thì cứ viết ra giấy thử xem. Trên nguyên tắc, đệ quy dùng để thay thế các đoạn code cần vòng lặp cho các ngôn ngữ không có lòng lặp.
Đặt là hàm TIMCHUOI với tham số: (i) chuỗi cần lọc
1. Nếu len chuỗi cần lọc < 8 thì trả về ""
2. Nếu không thì nhét một dấu " " vào trước nó.
3. Kế đó là tìm chuỗi " 103" trong left chuỗi -9
3. Nếu không có kết quả thì
3. Tìm xem thằng thứ chín sau chỗ có phải là trống hoặc không có thằng thứ chín
3.1. Nếu 5 thằng kế là số thì đã tìm ra, trải chuốt và trả về kết quả.
3.2. Chưa tìm được, chạy tiếp
4. Gọi TIMCHUOI(chuỗi kể từ chỗ đã tìm kia + 4)

Nếu dùng 2 hàm thì dễ hơn một chút:
Hàm TIMCHUOI gọi hàm TIMCHUOI2 hàm thứ nhất dọn data thành mảng, hàm thứ hai duyệt mảng theo đường lối đệ quy. Tức là xét phần tử đầu, nếu đạt thì trả về kết quả, nếu không thì gọi đệ quy với mảng đã bỏ đi phần tử đầu.
TIMCHUOI(du lieu):
trả về TIMCHUOI2(TextSplit(TRIM(du lieu), " "))

TIMCHUOI2(duLieu)
IF duLieu(1) thỏa return duLieu đã chải chuốt lại
ELSE TIMCHUOI2(DROP(duLieu, 1))
Em trả bài bác.
Em làm theo cách 2 thôi. Cách 1 vẫn chưa làm được.
Mã:
=LET(a,TEXTSPLIT(A1," "),dk,LAMBDA(x,IFERROR(AND(LEN(x)=8,EXACT(--x,x),--x>=10300000,--x<10400000),0)),timchuoi,LAMBDA(f,x,y,IF(dk(INDEX(x,y)),INDEX(x,y),f(f,x,y+1))),timchuoi(timchuoi,a,1))
 
Anh chị giúp em với ạ,

em có các dòng dữ liệu:

1. 0708581234 01 10347133 unable to contact => cần lấy giá trị 10347133
2. 10347129 01 0966205678 Confirmed => cần lấy giá trị 10347129
3. unable to contact 07085845678 01 10347138 => cần lấy giá trị 10347138

Anh Chị vui lòng hướng dẫn giúp em hàm để lấy ra chuỗi 8 số, luôn bắt đầu bằng 103xxxxx. Vị trí có thể bất kỳ: khi ở đầu, khi ở giữa, khi ở cuối như trên với ạ,
1 nhát là xong, nhanh gọn lẹ. Các vị ở trên làm cái gì mà dài thế
=IFERROR(MID(A1, SEARCH("103", A1), 8), "")
Bài đã được tự động gộp:

Công thức của em có kiểm tra từng con số trong dãy ký tự 8 số là đúng ý của anh @VetMini.

Em càng ngày càng giỏi hẳn!
/-*+//-*+//-*+/
Trình độ giải thuật vẫn chưa thông minh. bài này chỉ 1 công thức là xong
=IFERROR(MID(A1, SEARCH("103", A1), 8), "")
 
Hay quá! quả là bộ óc đi trước người khác 10 năm

***&&%***&&%***&&%

View attachment 303350

Đã làm theo Đúng Yêu cầu của thớt . Không giải thích nhiều. Thuật toán của tôi Chính xác rồi

1. 0708581234 01 10347133 unable to contact => cần lấy giá trị 10347133
2. 10347129 01 0966205678 Confirmed => cần lấy giá trị 10347129
3. unable to contact 07085845678 01 10347138 => cần lấy giá trị 10347138

Anh Chị vui lòng hướng dẫn giúp em hàm để lấy ra chuỗi 8 số, luôn bắt đầu bằng 103xxxxx. Vị trí có thể bất kỳ: khi ở đầu, khi ở giữa, khi ở cuối như trên với ạ,
 
Đã làm theo Đúng Yêu cầu của thớt . Không giải thích nhiều. Thuật toán của tôi Chính xác rồi
...
Chịu khó đọc một chút thì đã biết nhu cầu của thớt đã giải quyết xong từ bài #5, và thớt đã viết bài #6 để xác nhận như vậy.

Tất cả các bài sau đó đều là do chúng tôi muốn tập dợt viết hàm giải các trường hợp "nếu..."

Tự dưng có kẻ xớn xác, a thần phù tự cho là "làm cái gì mà dài thế"
Theo nguyên tắc học hỏi. Bài toán mở rộng thì càng dài càng tốt.
1 nhát là xong, nhanh gọn lẹ. Các vị ở trên làm cái gì mà dài thế
=IFERROR(MID(A1, SEARCH("103", A1), 8), "")
...
Trình độ giải thuật vẫn chưa thông minh. bài này chỉ 1 công thức là xong
=IFERROR(MID(A1, SEARCH("103", A1), 8), "")
1 nhát chém vào thân chuối đã có người đốn sẵn -.,\;
 
Chịu khó đọc một chút thì đã biết nhu cầu của thớt đã giải quyết xong từ bài #5, và thớt đã viết bài #6 để xác nhận như vậy.

Tất cả các bài sau đó đều là do chúng tôi muốn tập dợt viết hàm giải các trường hợp "nếu..."

Tự dưng có kẻ xớn xác, a thần phù tự cho là "làm cái gì mà dài thế"
Theo nguyên tắc học hỏi. Bài toán mở rộng thì càng dài càng tốt.

1 nhát chém vào thân chuối đã có người đốn sẵn -.,\;
GÓP VUI HÀM VBA
Mã:
Function ExtractNumber(inputString As String) As String
Dim mf5d36a3e36c77e959b37a798f6a85baa As Object
Dim cd4db14c276a96794e3dbeab7ab1755ab As Object
Dim wf685b050211a9ec00fbc744b9dd79df0 As String
wf685b050211a9ec00fbc744b9dd79df0 = "103\d{5}"
Set cd4db14c276a96794e3dbeab7ab1755ab = CreateObject("VBScript.RegExp")
cd4db14c276a96794e3dbeab7ab1755ab.Global = True
cd4db14c276a96794e3dbeab7ab1755ab.IgnoreCase = True
cd4db14c276a96794e3dbeab7ab1755ab.pattern = wf685b050211a9ec00fbc744b9dd79df0
If cd4db14c276a96794e3dbeab7ab1755ab.Test(inputString) Then
Set mf5d36a3e36c77e959b37a798f6a85baa = cd4db14c276a96794e3dbeab7ab1755ab.Execute(inputString)
ExtractNumber = mf5d36a3e36c77e959b37a798f6a85baa(0).Value
Else
ExtractNumber = ""
End If
End Function

=ExtractNumber(A1)
 
Web KT

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

Back
Top Bottom