Xử lý chuỗi dữ liệu text (1 người xem)

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

long8x49

Thành viên mới
Tham gia
27/11/12
Bài viết
17
Được thích
3
Dear all,

Em có file excell cột A là danh sách tên tác giả. Tuy nhiên, tên tác giả thì có các từ dính vào nhau hoặc ký tự thừa (dấu cách) ở cuối tên. Vậy em phải dùng công thức như thế nào để làm sạch được. Ví dụ:
Dương Thu Ái (có dấu cách cuối câu) thành Dương Thu Ái (không có dấu cách cuối câu)
Lại NguyênÂn thành Lại Nguyên Ân

Em gửi file mẫu đính kèm. Giúp em với ạ.

Em cảm ơn ạ.
 

File đính kèm

khó quá bạn, bỏ mấy khoảng trắng thì được rồi, nhưng tách tên thì không biết lấy gì làm mốc để tách.
làm sao để excel hiểu được VanAn với VanAnh? chắc phải sử dụng bộ từ điển tiếng việt để sau khi tách ra rồi dò lại coi nó có đúng chính tả không.
chắc phải gõ băng tay thôi...hihihih+-+-+-+
 
Dear all,

Em có file excell cột A là danh sách tên tác giả. Tuy nhiên, tên tác giả thì có các từ dính vào nhau hoặc ký tự thừa (dấu cách) ở cuối tên. Vậy em phải dùng công thức như thế nào để làm sạch được. Ví dụ:
Dương Thu Ái (có dấu cách cuối câu) thành Dương Thu Ái (không có dấu cách cuối câu)
Lại NguyênÂn thành Lại Nguyên Ân

Em gửi file mẫu đính kèm. Giúp em với ạ.

Em cảm ơn ạ.
Tách các chữ dính nhau e rằng không thể làm bằng công thức (có làm được chắc cũng rườm rà lắm)
Vậy nếu bạn chấp nhận giải pháp lập trình, tôi sẽ nghiên cứu tiếp
 
Chiểu theo ý kiến bác ndu96081631, em làm hàm tach() như sau:
PHP:
Function lowerUni(ByVal vnstr As String)
Dim C As String, i As Long
   vnstr = LCase(vnstr)
   For i = 1 To Len(vnstr)
      C = Mid(vnstr, i, 1)
      Select Case C
         Case ChrW$(97): C = ChrW$(65)
         Case ChrW$(225): C = ChrW$(193)
         Case ChrW$(224): C = ChrW$(192)
         Case ChrW$(7843): C = ChrW$(7842)
         Case ChrW$(227): C = ChrW$(195)
         Case ChrW$(7841): C = ChrW$(7840)
         Case ChrW$(259): C = ChrW$(258)
         Case ChrW$(7855): C = ChrW$(7854)
         Case ChrW$(7857): C = ChrW$(7856)
         Case ChrW$(7859): C = ChrW$(7858)
         Case ChrW$(7861): C = ChrW$(7860)
         Case ChrW$(7863): C = ChrW$(7862)
         Case ChrW$(226): C = ChrW$(194)
         Case ChrW$(7845): C = ChrW$(7844)
         Case ChrW$(7847): C = ChrW$(7846)
         Case ChrW$(7849): C = ChrW$(7848)
         Case ChrW$(7851): C = ChrW$(7850)
         Case ChrW$(7853): C = ChrW$(7852)
         Case ChrW$(101): C = ChrW$(69)
         Case ChrW$(233): C = ChrW$(201)
         Case ChrW$(232): C = ChrW$(200)
         Case ChrW$(7867): C = ChrW$(7866)
         Case ChrW$(7869): C = ChrW$(7868)
         Case ChrW$(7865): C = ChrW$(7864)
         Case ChrW$(234): C = ChrW$(202)
         Case ChrW$(7871): C = ChrW$(7870)
         Case ChrW$(7873): C = ChrW$(7872)
         Case ChrW$(7875): C = ChrW$(7874)
         Case ChrW$(7877): C = ChrW$(7876)
         Case ChrW$(7879): C = ChrW$(7878)
         Case ChrW$(111): C = ChrW$(79)
         Case ChrW$(243): C = ChrW$(211)
         Case ChrW$(242): C = ChrW$(210)
         Case ChrW$(7887): C = ChrW$(7886)
         Case ChrW$(245): C = ChrW$(213)
         Case ChrW$(7885): C = ChrW$(7884)
         Case ChrW$(244): C = ChrW$(212)
         Case ChrW$(7889): C = ChrW$(7888)
         Case ChrW$(7891): C = ChrW$(7890)
         Case ChrW$(7893): C = ChrW$(7892)
         Case ChrW$(7895): C = ChrW$(7894)
         Case ChrW$(7897): C = ChrW$(7896)
         Case ChrW$(417): C = ChrW$(416)
         Case ChrW$(7899): C = ChrW$(7898)
         Case ChrW$(7901): C = ChrW$(7900)
         Case ChrW$(7903): C = ChrW$(7902)
         Case ChrW$(7905): C = ChrW$(7904)
         Case ChrW$(7907): C = ChrW$(7906)
         Case ChrW$(105): C = ChrW$(73)
         Case ChrW$(237): C = ChrW$(205)
         Case ChrW$(236): C = ChrW$(204)
         Case ChrW$(7881): C = ChrW$(7880)
         Case ChrW$(297): C = ChrW$(296)
         Case ChrW$(7883): C = ChrW$(7882)
         Case ChrW$(117): C = ChrW$(85)
         Case ChrW$(250): C = ChrW$(218)
         Case ChrW$(249): C = ChrW$(217)
         Case ChrW$(7911): C = ChrW$(7910)
         Case ChrW$(361): C = ChrW$(360)
         Case ChrW$(7909): C = ChrW$(7908)
         Case ChrW$(432): C = ChrW$(431)
         Case ChrW$(7913): C = ChrW$(7912)
         Case ChrW$(7915): C = ChrW$(7914)
         Case ChrW$(7917): C = ChrW$(7916)
         Case ChrW$(7919): C = ChrW$(7918)
         Case ChrW$(7921): C = ChrW$(7920)
         Case ChrW$(121): C = ChrW$(89)
         Case ChrW$(253): C = ChrW$(221)
         Case ChrW$(7923): C = ChrW$(7922)
         Case ChrW$(7927): C = ChrW$(7926)
         Case ChrW$(7929): C = ChrW$(7928)
         Case ChrW$(7925): C = ChrW$(7924)
         Case ChrW$(273): C = ChrW$(272)
      End Select
   Next i
   lowerUni = vnstr
End Function

PHP:
Function Tach(a As String) As String
Dim i As Integer
a = Trim(a)
For i = Len(a) To 1 Step -1
    If Mid(a, i - 1, 1) = Chr(32) Then
        Tach = a
        Exit Function
    End If
    If Mid(a, i, 1) <> lowerUni(Mid(a, i, 1)) Then
        a = Left(a, i - 1) & Chr(32) & Right(a, Len(a) - i + 1)
        Tach = Trim(a)
        Exit Function
    End If
Next i
End Function
 
Dear all,

Em có file excell cột A là danh sách tên tác giả. Tuy nhiên, tên tác giả thì có các từ dính vào nhau hoặc ký tự thừa (dấu cách) ở cuối tên. Vậy em phải dùng công thức như thế nào để làm sạch được. Ví dụ:
Dương Thu Ái (có dấu cách cuối câu) thành Dương Thu Ái (không có dấu cách cuối câu)
Lại NguyênÂn thành Lại Nguyên Ân

Em gửi file mẫu đính kèm. Giúp em với ạ.

Em cảm ơn ạ.
Một cách giải quyết vấn đề của bài này bằng VBA
Hihi, chỉ giải cho bài này theo đúng dữ liệu trong bài thôi nhé ( không chơi mở rộng mở hẹp gì ráo trọi)
Dạng bài này rắc rối thấy bà đi
Thân
 

File đính kèm

Thấy anh Cò và vu_tuan_manh_linh làm bài này sao có ChrW(...) gì gì tùm lum vậy ta? Mình nghĩ đâu cần
Cứ vòng lập duyệt qua ký tự, thấy UCase(Ký tự) = Ký tự và trước nó là 1 ký tự khác rổng thì thêm 1 ký tự trắng vào thôi
Chẳng hạn là:
Mã:
Function SeparateStr(ByVal Text As String) As String
  Dim i As Long
  Dim tmp1 As String, tmp2 As String, tmp As String
  On Error Resume Next
  Text = Trim(Text)
  tmp = Left(Text, 1)
  For i = 2 To Len(Text)
    tmp1 = Mid(Text, i - 1, 1)
    tmp2 = Mid(Text, i, 1)
    If Len(Trim(tmp2)) Then
      If Len(Trim(tmp1)) Then
        If UCase(tmp2) = tmp2 Then tmp2 = " " & tmp2
      End If
    End If
    tmp = tmp & tmp2
  Next
  SeparateStr = tmp
End Function
Trên bảng tính, gõ công thức =TRIM(SeparateStr(A2)) rồi kéo fill xuống là được rồi
 
Lần chỉnh sửa cuối:
Thấy anh Cò và vu_tuan_manh_linh làm bài này sao có ChrW(...) gì gì tùm lum vậy ta? Mình nghĩ đâu cần
Cứ vòng lập duyệt qua ký tự, thấy UCase(Ký tự) = Ký tự và trước nó là 1 ký tự khác rổng thì thêm 1 ký tự trắng vào thôi
Chẳng hạn là:
Mã:
Function SeparateStr(ByVal Text As String) As String
  Dim i As Long
  Dim tmp1 As String, tmp2 As String, tmp As String
  On Error Resume Next
  Text = Trim(Text)
  tmp = Left(Text, 1)
  For i = 2 To Len(Text)
    tmp1 = Mid(Text, i - 1, 1)
    tmp2 = Mid(Text, i, 1)
    If Len(Trim(tmp2)) Then
      If Len(Trim(tmp1)) Then
        If UCase(tmp2) = tmp2 Then tmp2 = " " & tmp2
      End If
    End If
    tmp = tmp & tmp2
  Next
  SeparateStr = tmp
End Function
Trên bảng tính, gõ công thức =TRIM(SeparateStr(A2)) rồi kéo fill xuống là được rồi

Code của Thầy dùng như thế nào vậy ạ ? Phải thiết lập VBA phải ko ạ ? Hj. E ko biết khoản này.
 
Code của Thầy dùng như thế nào vậy ạ ? Phải thiết lập VBA phải ko ạ ? Hj. E ko biết khoản này.
Bạn phải Enable marco mới sử dụng được code
Cú pháp sử dụng code thì bác ndu đã nói như bài #6 phần chữ đậm đó
A2 là chuỗi Text
 
Một cách giải quyết vấn đề của bài này bằng VBA
Hihi, chỉ giải cho bài này theo đúng dữ liệu trong bài thôi nhé ( không chơi mở rộng mở hẹp gì ráo trọi)
Dạng bài này rắc rối thấy bà đi
Thân

Cách của bác thì nó tự động thêm dấu khoảng trắng giữa các từ rùi. thành ra tên nào đã có khoảng trắng thì lại thêm 1 khoảng trắng nữa.
 
Cách của bác thì nó tự động thêm dấu khoảng trắng giữa các từ rùi. thành ra tên nào đã có khoảng trắng thì lại thêm 1 khoảng trắng nữa.

Thật ra xử lý khoảng trắng thừa cũng chẳng khó khăn gì, nhưng do Excel có hàm TRIM nên cũng không cần viết
Thích thì vẫn làm được thôi.
Ví dụ code của tôi có đoạn
tmp = tmp & tmp2
Sửa thành:
If Not ((Right(tmp, 1) = " ") And (Left(tmp2, 1) = " ")) Then tmp = tmp & tmp2
Xong chuyện! Tức xét 2 phần tử chuẩn bị ráp vào, nếu bên phải phần tử 1 và bên trái phần tử 2 cùng là khoảng trắng thì.. không cho ráp
Trên bảng tính cứ gõ =SeparateStr(A2) khỏi hàm TRIM luôn
Ẹc... Ẹc...
 

File đính kèm

Lần chỉnh sửa cuối:
Thấy anh Cò và vu_tuan_manh_linh làm bài này sao có ChrW(...) gì gì tùm lum vậy ta? Mình nghĩ đâu cần
Cứ vòng lập duyệt qua ký tự, thấy UCase(Ký tự) = Ký tự và trước nó là 1 ký tự khác rổng thì thêm 1 ký tự trắng vào thôi
Em thử cái món UCase() nhưng không được nên mới dùng cái hàm loweruni() kia thầy Ndu ạ! Code em viết lỗi gì đó nên cứ tưởng UCase() không dùng cho tất cả ký tự Unicode được! Cảm ơn thầy nhiều!
Nhân tiện thầy cho em hỏi chút về hàm Trim() trong VBA; em đọc tài liệu thì nói là:Trim(string) Cắt bỏ tất cả các kí tự trắng dư bên trái, bên phải và ở giữa chuỗi string. Nếu đúng như thế thì chẳng cần dò điều kiện nữa, cứ cho lặp từ 1 đến len(tring), gặp Mid(string, i, 1)= Ucace(Mid(String, i ,1)) thì thêm khoảng trắng vào trước, thoát vòng lặp thì dùng hàm Trim() là xong. Nhưng em thấy nó không hoạt động như diễn giải về hàm Trim() mà chưa hiểu tại sao. Thầy giải thích giúp em với ạ!
 
Lần chỉnh sửa cuối:
Em thử cái món UCase() nhưng không được nên mới dùng cái hàm loweruni() kia thầy Ndu ạ! Code em viết lỗi gì đó nên cứ tưởng UCase() không dùng cho tất cả ký tự Unicode được! Cảm ơn thầy nhiều!
Nhân tiện thầy cho em hỏi chút về hàm Trim() trong VBA; em đọc tài liệu thì nói là:Trim(string) Cắt bỏ tất cả các kí tự trắng dư bên trái, bên phải và ở giữa chuỗi string. Nếu đúng như thế thì chẳng cần dò điều kiện nữa, cứ cho lặp từ 1 đến len(tring), gặp Mid(string, i, 1)= Ucace(Mid(String, i ,1)) thì thêm khoảng trắng vào trước, thoát vòng lặp thì dùng hàm Trim() là xong. Nhưng em thấy nó không hoạt động như diễn giải về hàm Trim() mà chưa hiểu tại sao. Thầy giải thích giúp em với ạ!

Bạn đọc trợ giúp chưa kỹ thôi.
Có hàm Trim nằm trong Module Strings - Strings.Trim
Có hàm Trim nằm trong Class WorksheetFunction - WorksheetFunction.Trim
Chỉ có WorksheetFunction.Trim là loại bỏ CẢ Ở GIỮA

Khi bạn viết a = Trim(a) thì đó là Strings.Trim

Bạn hãy chạy code dưới là hiểu ngay thôi

[GPECODE=vb]
Sub hichic()
Dim s As String, a As String
s = "chuoi dung de test Trim "

a = s
a = "*" & Trim(a) & "*"
MsgBox a & vbCrLf & "co " & Len(a) & " ky tu"

a = s
a = "*" & Strings.Trim(a) & "*"
MsgBox a & vbCrLf & "co " & Len(a) & " ky tu"

a = s
a = "*" & WorksheetFunction.Trim(a) & "*"
MsgBox a & vbCrLf & "co " & Len(a) & " ky tu"
End Sub
[/GPECODE]
 
Lần chỉnh sửa cuối:
Bạn đọc trợ giúp chưa kỹ thôi.
Có hàm Trim nằm trong Module Strings - Strings.Trim
Có hàm Trim nằm trong Class WorksheetFunction - WorksheetFunction.Trim
Chỉ có WorksheetFunction.Trim là loại bỏ CẢ Ở GIỮA
Như vậy, có lẽ hàm này dùng được thầy Ndu ạ!
PHP:
Function Tach(a As String) As String
Dim i As Integer
For i = Len(a) To 1 Step -1
    If Mid(a, i, 1) = UCase(Mid(a, i, 1)) Then
        a = Left(a, i - 1) & " " & Right(a, Len(a) - i + 1)
    End If
Next i
Tach = WorksheetFunction.Trim(a)
End Function
 

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

Back
Top Bottom