Thêm 1 bài toán tách chuổi (câu hỏi từ ddth.com)

Liên hệ QC
Các bạn kiểm tra lại, nếu cho ví dụ như thế này thì sai:
马来 西亚New Zealand 隆坡Kuala Lumpur
Có khoảng trắng trong chuỗi latin thì hàm tách đúng (New Zealand/Kuala Lumpur) nhưng khoảng trắng trong chuỗi không phải latin tách sai (马来/西亚//隆坡).
Nếu chấp nhận "New Zealand" là 1 nhóm thì "马来 西亚" cũng phải là 1 nhóm.
 
Thanks Mr. Long,
Khoảng trắng giữa các ký tự Hoa mình cũng nghĩ tới, nhưng lúc đó mình cho rằng chữ Hoa không có xài khoảng trắng. (nghĩ vậy chắc sai)
Vậy mình sửa lại code bài #12 và dự phòng luôn 2 khoảng trắng trở lên.
Nếu dự phòng luôn dấu chấm, dấu phẩy nữa thì thua! Chắc không có đâu ha!
 

File đính kèm

  • ExtractStringVer2.xls
    36.5 KB · Đọc: 19
Thanks Mr. Long,
Khoảng trắng giữa các ký tự Hoa mình cũng nghĩ tới, nhưng lúc đó mình cho rằng chữ Hoa không có xài khoảng trắng. (nghĩ vậy chắc sai)
Vậy mình sửa lại code bài #12 và dự phòng luôn 2 khoảng trắng trở lên.
Nếu dự phòng luôn dấu chấm, dấu phẩy nữa thì thua! Chắc không có đâu ha!

Không biết tiếng Hoa có dấu cách không, nhưng nếu có dấu cách mình nghĩ là nó liên tục.
Còn vấn đề này cần bàn tiếp, tại anhtuan đưa ví dụ gồm latin và Hoa nên các bạn nghĩ là các hàm này tách latin và Hoa. Thật ra nó chỉ tách 2 nhóm:
- Nhóm code <256 (trong nhóm này cũng có nhiều ký tự miên)
- Nhóm code >=256.
Ví dụ chuỗi 马来¥§¢ÆğĘĒﻉﻼﮖۻۺҗ西亚Malaysia吉隆坡 Excel và việc Xử lý dữ liệu
Kết quả sau khi tách:
Nhóm <256: ¥§¢ÆğĘĒ / / Malaysia / Excel và vi / c X / lý d / li / u
Nhóm >=256: 马来 / ﻉﻼﮖۻۺҗ西亚 / 吉隆坡 / / /
 
Không biết tiếng Hoa có dấu cách không, nhưng nếu có dấu cách mình nghĩ là nó liên tục.
Còn vấn đề này cần bàn tiếp, tại anhtuan đưa ví dụ gồm latin và Hoa nên các bạn nghĩ là các hàm này tách latin và Hoa. Thật ra nó chỉ tách 2 nhóm:
- Nhóm code <256 (trong nhóm này cũng có nhiều ký tự miên)
- Nhóm code >=256.
Ví dụ chuỗi 马来¥§¢ÆğĘĒﻉﻼﮖۻۺҗ西亚Malaysia吉隆坡 Excel và việc Xử lý dữ liệu
Kết quả sau khi tách:
Nhóm <256: ¥§¢ÆğĘĒ / / Malaysia / Excel và vi / c X / lý d / li / u
Nhóm >=256: 马来 / ﻉﻼﮖۻۺҗ西亚 / 吉隆坡 / / /


Oh, thế này là phức tạp vấn đề rùi
Liệu có bài toán thực tế không nhỉ
Nếu có như thế -> chúng ta phải có bảng mã của tất cả các ký tự đã có mặt trong bảng mã UNICOE của các ký tự của các ngôn ngữ đó -> phân loại được
hix:-=
 
Dùng tạm mấy hàm này cho chữ Hoa và chữ Anh theo yêu cầu bài #1 cái đã. Sau này gạp dữ liệu thực chữ Thái, chữ Ả rập ... thì tính sau. Chuyện này để phiền Anh Long nhắc mấy lần trong mấy bài liền, ngại quá.

1- Nếu 2 ngôn ngữ la tinh, trong đó kể luôn tiếng Việt có dấu, đó là vấn đề sắp xếp dữ liệu, tránh để tình trạng gộp lại rồi phải tách ra.
2- Nếu may chỉ 1 ngôn ngữ tượng hình + 1 ngôn ngữ Latinh , Dùng hàm này hoặc điều chỉnh lại cho những ngôn ngữ mà mã ASCII nửa dưới 256, nửa trên 256.(trong đó có tiếng Việt)
Chắc ở Việt nam chẳng có trường hợp dữ liệu có cả 2 ngôn ngữ đều tượng hình, hay 1 lúc 3, 4 ngôn ngữ như Bác Duy Long cảnh báo đâu.
Mà nếu có thì trở lại điều 1
 
Chắc ở Việt nam chẳng có trường hợp dữ liệu có cả 2 ngôn ngữ đều tượng hình, hay 1 lúc 3, 4 ngôn ngữ như Bác Duy Long cảnh báo đâu.
Mà nếu có thì trở lại điều 1

Yes, thế là đủ dùng, mà tác giả hỏi bài này (bên sân khách) chắc cũng chưa thăm chủ đề này rùi,

Đợi người hỏi vậy đã, biết đâu lại nảy sinh vấn đề khác...(???)
 
Yes, Đợi người hỏi vậy đã, biết đâu lại nảy sinh vấn đề khác...(???)
Cũng may mới là tên nước; nếu trong chuỗi la tin & tiếng hoa này mà có vài ký số biểu thị địa chỉ số nhà nữa chắc toi luôn!!!
 
Tôi nói lại lần nữa về bài toán này:
1> Chỉ có 2 ngôn ngữ là ANH và HOA (chắc chắn)
2> Trong phần tiếng HOA có khoảng trắng hay ko thì chưa chắc
Chỉ vậy thôi....
ANH TUẤN
 
Khoảng trắng thì xử rồi Anhtuan à. Còn ký tự số xen lẫn vào thì dùng linh hoạt 1 chút là được, không sửa code. Xem file thí dụ.
 

File đính kèm

  • ExtractStringVer2.xls
    34 KB · Đọc: 26
Khoảng trắng thì xử rồi Anhtuan à. Còn ký tự số xen lẫn vào thì dùng linh hoạt 1 chút là được, không sửa code. Xem file thí dụ.
Ai chà... hay nhỉ? Tuy nhiên yêu cầu tác giã ko cao đến mức đó đâu... Trong chuổi chỉ có chử, ko số siết hay ký tự đặc biệt gì ráo trọi...
Như vầy là ngon lành lắm rồi...
Cảm ơn sư phụ
 
Liệu có thể thêm code đếm trong chuỗi có bao nhiêu chuỗi con mỗi loại và dùng phép nối để chỉ cần công thức tách

thì hay biết bao cho người sử dụng​


Bạn xem thử thủ tục của mình ở bài trước. Có thể giải quyết được. Chỉ cần thêm giá trị thứ tự chuỗi con vào sau dấu cách (Biến Signal).
 
Bạn Boyxin ơi! không biết đoạn code này viết có giống ý bạn không? Mình cũng mạo muội gửi lên đâu, code này giống như file mình gửi bài trước nhưng chỉnh lại một tí cho gọn hơn và thêm yêu cầu điển số thự tự nhóm.

PHP:
Function TachChu(TargetText As String, TextType As String, Optional Signal As String)
Dim ResultText As String
Dim TextLenth, ZZ, Ordinal As String
Dim ZPoint(1000, 1) As Variant
IZ = -1
Ordinal = "2"
TextLenth = Len(TargetText) 'Dem so ky tu trong chuoi
If TextLenth = 0 Then
        TachChu = "": Exit Function
Else
        If TextType = 0 Then        'Quet ky tu ABC
            'Quet cac ky tu tu trai qua phai, ky tu nao la dang ABC thi cho vao bang luu
            For ZZ = 1 To TextLenth
                    If Asc((Mid(TargetText, ZZ, 1))) <> 63 Then
                         ResultText = ResultText + Mid(TargetText, ZZ, 1)
                         IZ = IZ + 1
                         ZPoint(IZ, 0) = ZZ
                         ZPoint(IZ, 1) = Mid(TargetText, ZZ, 1)
                    End If
            Next ZZ
        Else
        ' Quet cac ky tu tu trai qua phai, ky tu nao khong phai la dang ABC thi cho vao bang luu:
            For ZZ = 1 To TextLenth
                    If Asc((Mid(TargetText, ZZ, 1))) = 63 Then
                        ResultText = ResultText + Mid(TargetText, ZZ, 1)
                        IZ = IZ + 1
                        ZPoint(IZ, 0) = ZZ
                        ZPoint(IZ, 1) = Mid(TargetText, ZZ, 1)
                    End If
            Next ZZ
        End If
'=================================================
            'Gan gia tri tim duoc dau tien vao ket qua
        ResultText = ZPoint(0, 1)
            For JZ = 1 To IZ
                If ZPoint(JZ, 0) - ZPoint(JZ - 1, 0) = 1 Then
                    ResultText = ResultText + ZPoint(JZ, 1)
                Else
                    ResultText = ResultText + Signal + Ordinal + "-" + ZPoint(JZ, 1)
                    Ordinal = Ordinal + 1
                End If
            Next JZ
End If
TachChu = ResultText
End Function
 
Hàm của ca_dafi cho kết quả tốt, tuy nhiên phải chạy đến 3 vòng lặp. Mình viết kết hợp chỉ chạy 1 vòng, các bạn xem và cho ý kiến:
Mã:
Option Explicit
Function TachChu(TargetText As String, TextType As Byte)
Dim ResultText1 As String, ResultText2 As String
Dim ResultLT As String, ResultTQ As String, Result1 As String, Result2 As String, StrC As String
Dim TextLenth As Integer, i As Integer, j As Integer, k As Integer
Dim iCode As Byte
On Error GoTo ketthuc
    TextLenth = Len(TargetText)
For i = 1 To TextLenth + 1
  iCode = Asc((Mid(TargetText, i, 1)))
  StrC = Mid(TargetText, i, 1)
     If iCode <> 63 Then
       Result2 = LTrim(Result2)
       ResultTQ = Left(Result2, k)
         If ResultTQ <> ResultText2 Then Result2 = Result2 & " " & ResultText2
       k = 0
       ResultText2 = ""
             ResultText1 = ResultText1 & StrC
             j = j + 1
    Else
      Result1 = LTrim(Result1)
      ResultLT = Left(Result1, j)
         If ResultLT <> ResultText1 Then Result1 = Result1 & " " & ResultText1
      j = 0
      ResultText1 = ""
             ResultText2 = ResultText2 & StrC
             k = k + 1
    End If
Next
ketthuc:
 If TextType = 0 Then TachChu = Result1 & " " & ResultText1
 If TextType = 1 Then TachChu = Result2 & " " & ResultText2
End Function
 
Web KT
Back
Top Bottom