Tách dữ liệu theo điều kiện phức tạp ? (1 người xem)

Liên hệ QC

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

Hoàng Nhật Phương

Thành viên gắn bó
Tham gia
5/11/15
Bài viết
1,895
Được thích
1,219
Xin chào các bạn,chúc một ngày mới an lành.
Tôi đang vướng mắc một vấn đề đã nêu chi tiết minh họa trong file đính kèm, phiền các bạn bớt chút thời gian tìm xem có giải pháp nào để giúp cho tôi hoàn thành được vấn đề này không ạ?
Tôi xin cảm ơn các bạn nhiều.
 

File đính kèm

Đã thử sức và mất khá nhiều thời gian với bài toán này.
Kết quả sau nhiều giờ nghiên cứu là : "Em bó tay " --=0--=0--=0
Gửi tới bạn chủ thớt xinh xinh :Những bài tách dữ liệu mà không tuân theo một quy luật chung chung nào đó thì khó làm lắm bạn ah

Hihi, cảm ơn bạn đã cố gắng tìm cách giúp tôi!
Tôi cũng đã suy nghĩ khá nhiều đến vấn đề khi mà đưa vấn đề này lên hỏi bởi vì cũng hơi khó diễn tả được qui tắc cụ thể vì người con số nhập ở đây cũng không hoàn toàn theo một qui tắc nhất định. Vì vậy mà nên mới đưa nên vài mẫu và kết quả minh họa để các bạn hiểu được mục đích và qui luật là gì - vì tôi biết là trên diễn đàn này các bạn rất thông minh và sáng tạo. Bằng chứng là bạn HuuThang đã nhìn nhận và nêu ra qui luật và có rất nhiều giải pháp cho vấn đề này nữa..

Đặc biệt hơn hết là lại có thể sử dụng được công thức thông thường để giải quyết như bài 6 của bạn doveandrose.
Nhờ bài 6 của bạn doveandrose mà tôi thấy mình đã sai khi nghĩ rằng chắc bài này không có giải pháp hoặc nếu có thì chỉ có thể dùng lập trình
th
ì may ra. Nhưng không ngờ mọi việc hoàn toàn đều có hướng giải quyết. Thậm trí là bằng công thức mà cũng có thể. Bái phục!
 
Upvote 0
Mã:
h4=iferror( lookup(10^10,1*mid(c4,match(true, index(isnumber(1* mid(c4,row($1:$99),1)),0),0),row($1:$99))),"")

Mã:
n4=lookup(10^10,1* mid(if( c4>0,c4,c3), lookup(10^10,if(c4>0, find({"±";"+"},c4), find({"±";"-"},c3)))+1,row($1:$99)))*power(-1,row(c4))

Doveandrose ơi, Công thức gì mà nhìn cứ như là Ma Trận vậy - kích vào nó để sửa vùng tham chiếu mà cả bảng tính cũng tối sầm lại,, **~**
}}}}} Hơi bị ấn tượng đó nha , kết rùi đó ! }}}}}
2016 mọi việc tốt đẹp Bạn nhé !
 
Upvote 0
Doveandrose ơi, Công thức gì mà nhìn cứ như là Ma Trận vậy - kích vào nó để sửa vùng tham chiếu mà cả bảng tính cũng tối sầm lại,, **~**
}}}}} Hơi bị ấn tượng đó nha , kết rùi đó ! }}}}}
2016 mọi việc tốt đẹp Bạn nhé !

bây giờ mà có vấn đề gì tôi chả giải quyết nổi đâu à , sĩn ngoắc cần câu rồi , có khiếu nại gì thì sang năm mới giải quyết nhé
 
Upvote 0
bây giờ mà có vấn đề gì tôi chả giải quyết nổi đâu à , sĩn ngoắc cần câu rồi , có khiếu nại gì thì sang năm mới giải quyết nhé

khà khà liên hoan Tất Niên ah bạn ... hãy giữ gìn sức khỏe Bạn nhé.
Công thức của bạn Tuyệt vời rồi, tôi chỉ khiếu nại là vì công thức này của bạn mà suy nghĩ của tôi về chủ đề này đã "bị" thay đổi hehe.
Không thể tin được !! (y)

Một lần nữa xin cảm ơn.
 
Upvote 0
Đúng là câu lệnh .test() thay = .execute().count thì sát hơn

quote_icon.png
Nguyên văn bởi doatmenhhon

Thay thành .Pattern = "\b(\d+\.?\d*)\b" thì tạm được nhưng chưa phải cách làm hay.

Có cách nào hay hơn không bạn?

"hay hơn" là từ có tính chất tương đối và chủ quan. Rất khó nhận định.

Xin phép nói thẳng các bạn đừng buồn, cỡ trình độ chúng ta chỉ có thể nhìn được những mẫu quá tệ thôi chứ chưa đủ sức so sánh hiệu quả khi cỗ máy Regex xét chuỗi.

Nếu bạn cho biết theo bạn thì cái mẫu của bạn sẽ bắt được những chuỗi con như thế nào (1), và tại sao bạn thiết kế như vậy (2) thì tôi có thể giúp bạn phân tích lợi hại trong thiết kế đó. Theo tôi thì đưa ra "cách hay hơn" nó không giúp bạn học hỏi được bao nhiêu.

Điểm (1) sẽ cho bạn có cơ hội nhìn lại và thử thách giải pháp của mình. Điểm (2) sẽ cho bạn cơ hội xét lại xem code của bạn có thực hiện đúng giải pháp hay không. Tập làm quen với 2 yếu tố trên thì bạn sẽ có nhiều cơ hội tiến trên lĩnh vực lập trình.
 
Lần chỉnh sửa cuối:
Upvote 0
Có cách nào hay hơn không bạn?
1.Hiện tại tôi vẫn chưa hoàn thiện hoàn toàn theo ý của chủ thớt nhưng cách bạn là gò số nên tôi bảo không hay. Tôi gửi bạn 1 file để bạn tham khảo. Đúng là con người chúng ta không phải bỗng dưng mà giỏi tự mình tìm ra sơ hở để hoàn thiện là cái chí của mỗi người
2. Những kẻ chỉ nói như sách, như vẹt ra dáng đạo mạo thì không phải lúc nào cũng đáng để kính trọng
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
"hay hơn" là từ có tính chất tương đối và chủ quan. Rất khó nhận định.

Xin phép nói thẳng các bạn đừng buồn, cỡ trình độ chúng ta chỉ có thể nhìn được những mẫu quá tệ thôi chứ chưa đủ sức so sánh hiệu quả khi cỗ máy Regex xét chuỗi.

Nếu bạn cho biết theo bạn thì cái mẫu của bạn sẽ bắt được những chuỗi con như thế nào (1), và tại sao bạn thiết kế như vậy (2) thì tôi có thể giúp bạn phân tích lợi hại trong thiết kế đó. Theo tôi thì đưa ra "cách hay hơn" nó không giúp bạn học hỏi được bao nhiêu.

Điểm (1) sẽ cho bạn có cơ hội nhìn lại và thử thách giải pháp của mình. Điểm (2) sẽ cho bạn cơ hội xét lại xem code của bạn có thực hiện đúng giải pháp hay không. Tập làm quen với 2 yếu tố trên thì bạn sẽ có nhiều cơ hội tiến trên lĩnh vực lập trình.
(2) Trong file đính kèm của bài 1
Các chuỗi đều có >=2 nhóm số
Mỗi nhóm có thể có dấu thập phân (1 ký tự xen giữa) hoặc không
Các nhóm số cách nhau >=2 ký tự

Trong mẫu "\d+.?\d+"
Dấu ".?" ý là đại diện cho dấu thập phân ( có thể là "." hoặc "," hoặc không có )
Dùng "?" là để khi bắt chuỗi không bị lẫn giữa số thập phân và các nhóm số

(1) Mẫu "\d+.?\d+" sẽ tìm được chuỗi có số ký tự ít nhất là số nguyên có 2 chữ số

Bài 11 code theo ý ở trên. Nhờ VetMini có thể phân tích thêm để rộng đường tham khảo.
 
Upvote 0
(2) Trong file đính kèm của bài 1
Các chuỗi đều có >=2 nhóm số
Mỗi nhóm có thể có dấu thập phân (1 ký tự xen giữa) hoặc không
Các nhóm số cách nhau >=2 ký tự

Trong mẫu "\d+.?\d+"
Dấu ".?" ý là đại diện cho dấu thập phân ( có thể là "." hoặc "," hoặc không có ) // dấu chấm không phải là dấu thập phân, nó là bất cứ ký tự nào
Dùng "?" là để khi bắt chuỗi không bị lẫn giữa số thập phân và các nhóm số

(1) Mẫu "\d+.?\d+" sẽ tìm được chuỗi có số ký tự ít nhất là số nguyên có 2 chữ số // kết quả không hẳn số nguyên. Nếu số nguyên thì là 2 chứ số, nếu số thập phân thì là 3 (kế cả lý tự ở giữa 2 số)

Bài 11 code theo ý ở trên. ...

1) Như tôi chú thích ở trên, mẫu của bạn sai (có lẽ bị sơ xuất nên bạn quên rằng dấu chấm là ký tự đại diện chứ không phải là dấu thập phân). Sỡ dĩ bạn không nhận ra chỗ sai là vì dữ liệu test của bạn bị giới hạn. Nếu test chuỗi "ab123c45def" bạn sẽ thấy kết quả là "123c45", thay vì "123" và "45" mới đúng yêu cầu. Bất cứ ký tự nào chen giữa 2 số đều làm cho mẫu của bạn sai.

Ký tự chấm là "\."

2) mẫu của bạn chỉ cho ra 2 chứ số trở lên. Muốn lấy 1 chứ số, bạn phải đóng ngoặc và chấm hỏi phần kể từ dấu chấm
"\d+(\.?\d+)?"

3) code lấy các chuỗi con
dim mat as object
...
if .Test(s) Then
set mat = .Execute(s)
' bây giờ mat là một collection của các chuỗi con, muốn lấy phần nào thì lấy
End If

Chú thích thêm:
Mẫu lấy số là một trong những vấn đề phức tạp. Bài trên tôi chỉ nói theo kiểu giản dị.
Nếu muốn xét hết tất cả các trường hợp thì phải xét những trường hợp khong hợp lệ như:
- nhiều hơn 1 dấu thập phân
- không có số trước dấu thâp phân ( .123 ) đối với tiếng Anh thì đuợc nhưng đối với tiếng Việt thì sao?
- sô không đi đầu ( 0678 )
 
Lần chỉnh sửa cuối:
Upvote 0
Đánh giá thế nào thì cũng vậy thôi bạn.
Bạn có thể cho biết tại sao không xử lý được hay không, vì tôi cũng không hiểu.
Rất cảm ơn nếu bạn cho biết.
Của bạn là + và underline nên không xử lý là phải. Muốn được sửa code 1 chút. Hi. Dù sao tôi cũng hơi nóng tính. Thành thật xin lỗi bạn.
 
Lần chỉnh sửa cuối:
Upvote 0
Đưa ra thì làm sao hả nàng Dove quyến rũ ^^

tôi không có hứng thú đi giải quyết những chuyện không phải do chủ topic đề ra
ở trên tôi có viết công thức và chủ topic vào báo là đã sử dụng được như thế đã là đủ , còn các thể loại khác muốn lôi kéo khán giả thì cứ việc , tôi không quan tâm .
à chắc là sắp có người đánh giá tôi không bao giờ tiến bộ được chứ gì ?
 
Lần chỉnh sửa cuối:
Upvote 0
Mã:
h4=iferror( lookup(10^10,1*mid(c4,match(true, index(isnumber(1* mid(c4,row($1:$99),1)),0),0),row($1:$99))),"")

Mã:
n4=lookup(10^10,1* mid(if( c4>0,c4,c3), lookup(10^10,if(c4>0, find({"±";"+"},c4), find({"±";"-"},c3)))+1,row($1:$99)))*power(-1,row(c4))
công thức này là tôi biết Doveandrose là cao thủ nào rồi--=0--=0
 
Upvote 0
Cứ bài nào cũng em "Xinh Xinh" và ăn nói "ngọt lùi" thì mấy anh ấy cứ nhiệt tình lắm lắm...
--------------
Cơ mà hàm power(-1,row(c4)) này tương đương với (-1^row(c4)) không ta???

1. Tôi thì nghe ngọt là ơn ớn, cho nên tôi ngại trả lời lắm. Tuy nhiên, cũng nhìn nhận cô ta chịu khó diễn tả vấn đề của mình tương đối đàng hoàng. Ăn nói ngọt ngào, diễn tả vấn đề rõ ràng, cô này sẽ tiến xa trên đường sự nghiệp.

2. Hàm power và toán tử ^ hầu như in hệt nhau. Ngày xưa, hàm power có hơi chậm hơn 1 chút (vài phần tỷ giây), nhưng bây giờ các compiler mới rất thông minh, 2 cái như nhau.
Có phe thì nói toán tử gõ dễ hơn, nhưng phe kia thì cho rằng toán tử hơi nguy hiểm nếu không nhét phần mũ vào giữa dấu ngoặc. vd 123^(3/4) gõ nhầm thành 123^3/4. Theo quan niệm tôi thì nếu dùng toán tử, ta nên cẩn thận về thứ tự ưu tiên sử lý toán tử. Nếu không chắc 100% thì đóng ngoặc là cách tốt nhất.
 
Upvote 0
Nhìn thấy rất tuyệt,
Để xem mượn bài bác #doveandrose áp dụng vào bài của tôi xem sao.
Xin cảm ơn.
 
Upvote 0
1. Tôi thì nghe ngọt là ơn ớn, cho nên tôi ngại trả lời lắm. Tuy nhiên, cũng nhìn nhận cô ta chịu khó diễn tả vấn đề của mình tương đối đàng hoàng. Ăn nói ngọt ngào, diễn tả vấn đề rõ ràng, cô này sẽ tiến xa trên đường sự nghiệp.

2. Hàm power và toán tử ^ hầu như in hệt nhau. Ngày xưa, hàm power có hơi chậm hơn 1 chút (vài phần tỷ giây), nhưng bây giờ các compiler mới rất thông minh, 2 cái như nhau.
Có phe thì nói toán tử gõ dễ hơn, nhưng phe kia thì cho rằng toán tử hơi nguy hiểm nếu không nhét phần mũ vào giữa dấu ngoặc. vd 123^(3/4) gõ nhầm thành 123^3/4. Theo quan niệm tôi thì nếu dùng toán tử, ta nên cẩn thận về thứ tự ưu tiên sử lý toán tử. Nếu không chắc 100% thì đóng ngoặc là cách tốt nhất.

Xin chào các bạn,
Trước hết tôi xin cảm ơn tất cả mọi người đã dành nhiều thời gian tìm cách giúp đỡ cho tôi.
Mặc dù điều tôi cần đã sớm được đáp ứng nhưng các trao đổi và nhiều giải pháp tiếp theo như thế này tất cả đều rất cần thiết cho những người kém cỏi đang muốn học hỏi như tôi.(kiến thức tầm nào thì tìm hiểu tầm ở tầm đó-tôi không hiểu được gì thì cũng có thể lưu lại sau này biết đâu cần đến,hihi)
Sau là tôi muốn gửi đến các bạn về suy nghĩ của tôi, nếu có gì lạ hay khác biệt ở trên diễn đàn này mong các bạn thông cảm cho với những người mới như tôi ạ:
Ngoài những bài viết trong chủ đề của tôi thì tôi rất ít khi đọc các bài viết ở chủ đề khác (có thể là do tôi mới tham gia diễn đàn nên chưa để ý gì nhiều hoặc có thể tôi không có thói quen như vậy và tôi hiện tại cũng rất ít khi tham gia diễn đàn nếu không có vấn đề gì vướng mắc) vì vậy mà tôi cũng không biết các bạn cư xử hay bày tỏ cảm xúc của mình như thế nào nữa.
Còn với riêng tôi,tôi nghĩ đơn giản là cần phải tôn trọng mọi người nhất là ở một cộng đồng rộng lớn như thế này và điều càng khiến tôi trân trọng hơn hết là mọi người không hề quen tôi mà lại có thể dành nhiều thời gian và công sức để giúp đỡ cho tôi.Ngoài sự trân trọng và lòng ngưỡng mộ ra tôi không biết đáp lại với các bạn thế nào để có thể vừa lòng tất cả mọi người khi mà trên một diễn đàn không ai biết ai như thế này.Tôi cũng thấy diễn đàn có nút cảm ơn nhưng với tôi nhấn vào đó như vậy thôi mà không nói gì nữa tạo cho tôi cảm giác như thiếu thiếu một cái gì đó so với công sức mà các bạn đã cố gắng nỗ lực dành nhiều thời gian để giúp đỡ tôi.Tuy nhiên cũng có lúc tôi không thể nói cảm ơn cho từng bài viết được và nhờ nút cảm ơn nói thay tôi điều đó.

Tôi chỉ muốn nói là tôi rất trân trọng và ngưỡng mộ các bạn rất nhiều.
Chúc các bạn năm 2016 nhiều sức khỏe,luôn thành công trong công việc, hạnh phúc trong cuộc sống riêng tư.
 
Upvote 0
Web KT

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

Back
Top Bottom