Hỏi cách tách chuỗi với điều kiện cho trước

Liên hệ QC

thaihau2004

Thành viên mới
Tham gia
4/5/13
Bài viết
34
Được thích
6
Chào các bạn, mình có 1 vấn đề suy nghĩ bữa giờ mà chưa giải quyết đc &&&%$R, nay post lên đây mong các bạn/ anh/chị giúp với:
Bài toán: mình có 1 chuỗi dài hơn 40 kí tự (chuỗi A), làm cách nào để chia nhỏ chuỗi này thành nhiều parts (chuỗi B, C,...), mỗi part như vậy chứa tối đa 40 kí tự. điều kiện là: khi đếm chuỗi A đến kí tự thứ 40 mà kí tự này nằm trong 1 từ nào đó thì ko đc cắt ở đây, mà phải cắt ở khoẳng trắng kề trước rồi bê qua part2 (mục đích để giữ ý nghĩa của chuỗi kí tự), đến part2 cũng xét giống như vậy,...đến khi cắt hết chuỗi A thì thôi.

Các bạn xem file mình gữi nhé.
chuỗi A: CONG TY TRACH NHIEM HUU HAN QUANG CAO THUONG MAI SEN VANG[/TD]

kết quả:
part 1: CONG TY TRACH NHIEM HUU HAN QUANG CAO
part 2: THUONG MAI SEN VANG

Cám ơn các cao thủ hén :)
 

File đính kèm

  • Book1.xlsx
    9.5 KB · Đọc: 18
dữ liệu như trong file có 1 cao thủ làm được đó. vì excel hỏng biết THUONG MAI SEN VANG là tên của 1 công ty. mà chỉ có cao thủ kia biết thôi
đó là
thaihau2004 --=0
 
Upvote 0
Nếu chỉ cần giữ từ không bị cắt, tức là chỉ được phép ngắt ở dấu trống thì giải thuật như sau:

- dùng hàm split ngắt chuỗi theo dấu trống
- ráp từng phần tử lại, khi độ dài trên 40 thì kết chuỗi con vừa được và chừa từ lại làm chuỗi con kế tiếp

Nếu phải giữ trọn ý nghĩa của chuỗi thì bắt buộc phải dùng từ điển. Lập ra một từ điển rồi cứ do đó mà trích.
 
Upvote 0
dữ liệu như trong file có 1 cao thủ làm được đó. vì excel hỏng biết THUONG MAI SEN VANG là tên của 1 công ty. mà chỉ có cao thủ kia biết thôi
đó là
thaihau2004 --=0

bạn ko hiểu ý mình rùi, ý mình là chỉ cần giữ từ ko bi cắt thôi. Cụ thể ví dụ trên: nếu dựa trên rule: đúng 40 kí tự là cắt thì kết quả part 1 là: "CONG TY TRACH NHIEM HUU HAN QUANG CAO TH", và part 2 là: "UONG MAI SEN VANG"
bạn thấy chữ THUONG bị cắt ra rất vô duyên ko? ^^' nên mình cần để chữ THUONG qua part 2 luôn.
 
Lần chỉnh sửa cuối:
Upvote 0
Hi, bạn code thử theo cái file mình attached đc ko? mình mới tập tành làm vba thôi. còn phải học nhiều. cám ơn nhé.
 
Upvote 0
Tức là bạn cần code chứ đâu cần giải thuật?
Nói ngay từ đầu cho rồi.
Tôi đọc thấy "suy nghĩ bữa giờ mà chưa giải quyết đc" nên tưởng bạn chỉ bí giải thuật.
 
Upvote 0
bạn ko hiểu ý mình rùi, ý mình là chỉ cần giữ từ ko bi cắt thôi. Cụ thể ví dụ trên: nếu dựa trên rule: đúng 40 kí tự là cắt thì kết quả part 1 là: "CONG TY TRACH NHIEM HUU HAN QUANG CAO TH", và part 2 là: "UONG MAI SEN VANG"
bạn thấy chữ THUONG bị cắt ra rất vô duyên ko? ^^' nên mình cần để chữ THUONG qua part 2 luôn.
nói vậy thôi cho vui chứ không phải là không có cách giải
theo yêu cầu trong file thì cthuc cho a11
và b11
--=0

chẳng cần code nữa
 
Upvote 0
Tức là bạn cần code chứ đâu cần giải thuật?
Nói ngay từ đầu cho rồi.
Tôi đọc thấy "suy nghĩ bữa giờ mà chưa giải quyết đc" nên tưởng bạn chỉ bí giải thuật.

oầy, cần code luôn bạn, đây chỉ là 1 module trong bài toán lớn mình đang giải quyết thôi.
hồi xưa cũng học IT, nhưng đi làm mình bỏ lập trình lâu quá rồi, giờ quay lại thì xem như dân mới vào nghề thui -\\/.
 
Upvote 0
Lần chỉnh sửa cuối:
Upvote 0
em chua test cận thận nha anh Thương, nếu có cái khoảng trăng ở ký tự 36 và 39 thì


hic hic

thế bạn không thấy tôi nói là theo yêu cầu trong file à
vid file có mỗi 1 ô dữ liệu thì bạn định tính chuyện tổng quất thế nào ?--=0
 
Upvote 0
nói vậy thôi cho vui chứ không phải là không có cách giải
theo yêu cầu trong file thì cthuc cho a11

và b11
--=0

chẳng cần code nữa

Cái này chỉ giải quyết cho chuỗi đó thôi, mình hỏi cho 1 bài toán tổng quát kìa, ^^' ô A3 có thể là bất kì chuỗi nào dài hơn 40 chars
 
Upvote 0
Cách split và ráp lại là giải thuật cơ bản.
Thực ra còn cách khác là chọn đại ở ký tự thứ 41, nếu không phải là dấu trống thì dò ngược lại tìm dấu trống. Phần trước được một chuỗi con. Phần sau tiếp tục tìm và ngắt.
Bài này có thể code theo kiểu hàm đệ quy. Để sáng mai tính thử xem.
 
Upvote 0
Chào các bạn, mình có 1 vấn đề suy nghĩ bữa giờ mà chưa giải quyết đc &&&%$R, nay post lên đây mong các bạn/ anh/chị giúp với:
Bài toán: mình có 1 chuỗi dài hơn 40 kí tự (chuỗi A), làm cách nào để chia nhỏ chuỗi này thành nhiều parts (chuỗi B, C,...), mỗi part như vậy chứa tối đa 40 kí tự. điều kiện là: khi đếm chuỗi A đến kí tự thứ 40 mà kí tự này nằm trong 1 từ nào đó thì ko đc cắt ở đây, mà phải cắt ở khoẳng trắng kề trước rồi bê qua part2 (mục đích để giữ ý nghĩa của chuỗi kí tự), đến part2 cũng xét giống như vậy,...đến khi cắt hết chuỗi A thì thôi.

Các bạn xem file mình gữi nhé.
chuỗi A: CONG TY TRACH NHIEM HUU HAN QUANG CAO THUONG MAI SEN VANG[/TD]

kết quả:
part 1: CONG TY TRACH NHIEM HUU HAN QUANG CAO
part 2: THUONG MAI SEN VANG

Cám ơn các cao thủ hén :)
Tôi tò mò chút: Không biết bạn CẮT mấy chuổi này để làm gì?
Tính tôi hơi.. kỳ: Phải biết mục đích mới có hứng viết code
 
Upvote 0
Tôi tò mò chút: Không biết bạn CẮT mấy chuổi này để làm gì?
Tính tôi hơi.. kỳ: Phải biết mục đích mới có hứng viết code

Có 1 số system muốn upload dữ liệu vào thì nó bắt độ dài của chuỗi trong excel ko quá 40 kí tự đó bạn. Nếu dài hơn thì cắt nhỏ ra, bỏ vào field thứ 2 (field thứ 2 cũng ko quá 40 kí tự),.vv..
 
Upvote 0
Có 1 số system muốn upload dữ liệu vào thì nó bắt độ dài của chuỗi trong excel ko quá 40 kí tự đó bạn. Nếu dài hơn thì cắt nhỏ ra, bỏ vào field thứ 2 (field thứ 2 cũng ko quá 40 kí tự),.vv..
chưa cần đến vba đâu hàm xong rồi
=LEFT(A1,FIND(",",SUBSTITUTE(A1," ",",",LEN(LEFT(A1,40))-LEN(SUBSTITUTE(LEFT(A1,40)," ","")))))
bạn test lại nhé!
phần đuôi chắc ko cần làm thêm nữa tự xử nhé
 

File đính kèm

  • ban xem co dung y chua.xlsx
    9.6 KB · Đọc: 12
Lần chỉnh sửa cuối:
Upvote 0
chưa cần đến vba đâu hàm xong rồi

bạn test lại nhé!
phần đuôi chắc ko cần làm thêm nữa tự xử nhé

wao, đúng ý mình rồi bạn. cám ơn nhiều nhé!!! để giờ mình tự mò tiếp phần đuôi. trên này quả thật là nhiều cao thủ thật!!! -+*/
 
Lần chỉnh sửa cuối:
Upvote 0
Tôi tò mò chút: Không biết bạn CẮT mấy chuổi này để làm gì?
Tính tôi hơi.. kỳ: Phải biết mục đích mới có hứng viết code

Thật sự tôi cũng chẳng biết bạn ấy ngắt hàng làm gì.
Chỉ biết rằng việc ngắt hàng cũng thường xảy ra cho các công việc chuyên môn về trình bày chuỗi. Excel không phải là phần mềm chuyên về chuỗi nên ít thấy. Tuy nhiên những ứng dụng phần mềm khác thì việc phải xử lý chuỗi dài xảy ra khá thường xuyên.

Bài này hình như chủ chỉ cốt xử lý tên công ty cho nên dùng hàm Excel đủ rồi.
Tuy nhiên nếu đem áp dụng tổng quát, chuõi rất dài thì e rằng phải viết code vì hàm rất luộm thuộm.
 
Upvote 0
Đêm qua tôi hứa sẽ thử viết code hàm đệ quy:

Mã:
Sub DoanChuoi(ByVal diaChi As Range, ByVal doDai As Integer, ByVal chuoi As String)
[COLOR=#008000]' hàm tách chuỗi ra từng đoạn dài tối đa doDai, và ghi vào các ô bên cạnh[/COLOR]
[COLOR=#008000]' tham số:
' diaChi : ô đầu tiên để ghi kết quả, đoạn đầu tiên sẽ ghi vào ô này, các đoạn sau ghi vào các cột kế tiếp
' doDai : độ dài tối đa ấn định cho mỗi đoạn
' chuoi : chuỗi cần ngắt đoạn
[/COLOR]
If Len(chuoi) <= doDai Then diaChi.Offset(0, 1).Value = chuoi:    Exit Sub [COLOR=#008000]' đoạn cuối cùng[/COLOR]

Dim ngat As Integer [COLOR=#008000]' điểm ngắt chuỗi dự tính[/COLOR]

ngat = InStrRev(Left(chuoi, doDai + 1), " ") [COLOR=#008000]' tìm khoảng trắng gần đuôi nhất của đoạn nhỏ dự trù[/COLOR]

diaChi.Offset(0, 1).Value = Left(chuoi, ngat - 1) [COLOR=#008000]' ghi đoạn nhỏ này[/COLOR]

Call DoanChuoi(diaChi.Offset(0, 1), doDai, Mid(chuoi, ngat + 1)) [COLOR=#008000]' tiếp tục với phần sau
[/COLOR]
End Sub

cách dùng hàm, vd cần tách chuỗi ở A1, ghi vào A2, A3,...:

Call DoanChuoi(Range("A2", 40, Range("A1").Value)

Nếu A1 chứa đoạn chuỗi sau:

It is to bring to your notice that we strictly follow the protocol order when addressing the higher authorities. We do not address the higher authorities by name at the work place. (180)

Kết quả sau khi chạy hàm

A2: It is to bring to your notice that we (37)
A3: strictly follow the protocol order when (39)
A4: addressing the higher authorities. We do (40)
A5: not address the higher authorities by (37)
A6: name at the work place. (23)
 
Upvote 0
Web KT

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

Back
Top Bottom