Nhờ giúp đoạn code lấy dữ liệu từ file text UTF-8

Liên hệ QC

nghiaphuc

Thành viên gạo cội
Thành viên danh dự
Tham gia
25/9/09
Bài viết
5,730
Được thích
8,847
Giới tính
Nam
Nghề nghiệp
Giáo viên
Xin chào các anh chị em.
Mình có một bài toán "nhỏ nhỏ" thế này mà nghĩ mãi chưa ra, nhờ các anh chị em giải đáp giúp.
Vấn đề của mình là cần lấy dữ liệu từ file text vào trong file Excel, nội dung file là văn bản tiếng Việt Unicode.
Nếu file nguồn được mã hóa dạng Unicode thì việc lấy dữ liệu không có vấn đề gì, tuy nhiên nếu file nguồn được mã hóa dạng UTF-8 thì khi lấy dữ liệu vào Excel, tiếng Việt không được hiển thị đúng như mong muốn.
Ví dụ: Mình có 2 file text, nội dung hoàn toàn giống nhau, một file mã hóa dạng Unicode và một file mã hóa dạng UTF-8.
Đoạn code của mình chỉ đơn giản là thế này:
C#:
Sub LayDuLieu()
    Dim MyFile, FS
    
    Set FS = CreateObject("Scripting.FileSystemObject")
    Set MyFile = FS.OpenTextFile(ThisWorkbook.Path & "\Vi du_uni.txt", 1, , -2)
    Sheet1.[D2] = MyFile.ReadAll
    Set MyFile = FS.OpenTextFile(ThisWorkbook.Path & "\Vi du_utf.txt", 1, , -2)
    Sheet1.[D4] = MyFile.ReadAll
End Sub
Sau khi chạy code thì kết quả thành thế này:
Vi du.png
Vấn đề mình cần các anh chị em giúp đỡ là: Cần phải sửa code như thế nào để khi làm việc với file UTF-8 cũng được kết quả như với file Unicode?

Xin cảm ơn các anh chị em đọc bài và giúp đỡ.
 

File đính kèm

  • Lay du lieu tu Text.xlsm
    20.9 KB · Đọc: 7
  • Vi du_uni.txt
    264 bytes · Đọc: 6
  • Vi du_utf.txt
    180 bytes · Đọc: 7
Xin chào các anh chị em.
Mình có một bài toán "nhỏ nhỏ" thế này mà nghĩ mãi chưa ra, nhờ các anh chị em giải đáp giúp.
Vấn đề của mình là cần lấy dữ liệu từ file text vào trong file Excel, nội dung file là văn bản tiếng Việt Unicode.
Nếu file nguồn được mã hóa dạng Unicode thì việc lấy dữ liệu không có vấn đề gì, tuy nhiên nếu file nguồn được mã hóa dạng UTF-8 thì khi lấy dữ liệu vào Excel, tiếng Việt không được hiển thị đúng như mong muốn.
Ví dụ: Mình có 2 file text, nội dung hoàn toàn giống nhau, một file mã hóa dạng Unicode và một file mã hóa dạng UTF-8.
Đoạn code của mình chỉ đơn giản là thế này:
C#:
Sub LayDuLieu()
    Dim MyFile, FS
  
    Set FS = CreateObject("Scripting.FileSystemObject")
    Set MyFile = FS.OpenTextFile(ThisWorkbook.Path & "\Vi du_uni.txt", 1, , -2)
    Sheet1.[D2] = MyFile.ReadAll
    Set MyFile = FS.OpenTextFile(ThisWorkbook.Path & "\Vi du_utf.txt", 1, , -2)
    Sheet1.[D4] = MyFile.ReadAll
End Sub
Sau khi chạy code thì kết quả thành thế này:
View attachment 235488
Vấn đề mình cần các anh chị em giúp đỡ là: Cần phải sửa code như thế nào để khi làm việc với file UTF-8 cũng được kết quả như với file Unicode?

Xin cảm ơn các anh chị em đọc bài và giúp đỡ.

Anh Nghĩa Phúc tham khảo thêm ạ, có một module và hàm có tên "mdlFunc" kèm theo Anh ạ:
Mã:
Sub cmdFormatOperation_Click()
    Dim opBook As Workbook, planBook As Workbook
    Dim opSht As Worksheet, Sh As Worksheet, rng As Range, rng2 As Range
    
    Set Sh = ThisWorkbook.Worksheets(1)
    Set opBook = OpenBook(Sh.Cells(8, "E").Value, True)
    
    If opBook Is Nothing Then
        MsgBox "Operation file is invalid"
        Exit Sub
    End If
    
    Set opSht = opBook.Worksheets(1)
    
    For Each rng In opSht.Range("A1:A4")
         Sh.Range("E4").Value = Sh.Range("E4").Value & vbNewLine & rng.Value
    Next rng
    
    'CloseBookIfOpenByMe opBook, False

End Sub
 

File đính kèm

  • Lay du lieu tu Text.xlsm
    24.6 KB · Đọc: 11
Lần chỉnh sửa cuối:
Upvote 0
Bạn thử dùng code, hình như không có phương pháp chuẩn nào để xác định kiểu encoding là UTF8 hay 16, dựa vào BOM cũng không chính xác vì file utf8 có thể không cần BOM. Vì vậy mình đoán chỉ có cách thử chọn thôi.
Mã:
Sub a()
    Dim Strym As New ADODB.Stream
    Dim str As String
    With Strym
        .Charset = "utf-8"
        .Open
        .LoadFromFile ThisWorkbook.Path & "\Vi du_utf.txt"
        str = .ReadText
        .Close
    End With
    Set Strym = Nothing
    [D6] = str
End Sub
 
Upvote 0
Anh Nghĩa Phúc tham khảo thêm ạ, có một module và hàm có tên "mdlFunc" kèm theo Anh ạ:
Mã:
Sub cmdFormatOperation_Click()
    Dim opBook As Workbook, planBook As Workbook
    Dim opSht As Worksheet, Sh As Worksheet, rng As Range, rng2 As Range  
    Set Sh = ThisWorkbook.Worksheets(1)
    Set opBook = OpenBook(Sh.Cells(8, "E").Value, True)  
    If opBook Is Nothing Then
        MsgBox "Operation file is invalid"
        Exit Sub
    End If  
    Set opSht = opBook.Worksheets(1)  
    For Each rng In opSht.Range("A1:A4")
         Sh.Range("E4").Value = Sh.Range("E4").Value & vbNewLine & rng.Value
    Next rng  
    'CloseBookIfOpenByMe opBook, False
End Sub
Cảm ơn Oanh Thơ, code chạy theo đúng ý mình rồi, tuy hơi dài chút. Mình cũng đã thử đến phương thức Workbooks.OpenText nhưng không được, so lại code mình mới thấy mấu chốt vấn đề nằm ở chỗ tham số Origin:=65001 mà mình đã không biết đến nó.. Mình cũng đã nghĩ tới phương án dùng code để Save as cái file text kia thành dạng Unicode nhưng mà thấy kỳ cục quá.
Bạn thử dùng code, hình như không có phương pháp chuẩn nào để xác định kiểu encoding là UTF8 hay 16, dựa vào BOM cũng không chính xác vì file utf8 có thể không cần BOM. Vì vậy mình đoán chỉ có cách thử chọn thôi.
Mã:
Sub a()
    Dim Strym As New ADODB.Stream
    Dim str As String
    With Strym
        .Charset = "utf-8"
        .Open
        .LoadFromFile ThisWorkbook.Path & "\Vi du_utf.txt"
        str = .ReadText
        .Close
    End With
    Set Strym = Nothing
    [D6] = str
End Sub
Cảm ơn anh, code rất ngắn gọn và đáp ứng đúng yêu cầu ạ, chỉ có câu lệnh Dim Strym As New ADODB.Stream thì trên máy em không chạy được nên phải thay thành 2 câu Dim Strym và Set Strym = CreateObject("ADODB.Stream").
Về dữ liệu nguồn thì trong trường hợp cụ thể này đã đảm bảo là UTF-8 nên code như vậy là ổn rồi ạ.
 
Lần chỉnh sửa cuối:
Upvote 0
Cảm ơn Oanh Thơ, code chạy theo đúng ý mình rồi, tuy hơi dài chút. Mình cũng đã thử đến phương thức Workbooks.OpenText nhưng không được, so lại code mình mới thấy mấu chốt vấn đề nằm ở chỗ tham số Origin:=65001 mà mình đã không biết đến nó.. Mình cũng đã nghĩ tới phương án dùng code để Save as cái file text kia thành dạng Unicode nhưng mà thấy kỳ cục quá.

Cảm ơn anh, code rất ngắn gọn và đáp ứng đúng yêu cầu ạ, chỉ có câu lệnh Dim Strym As New ADODB.Stream thì trên máy em không chạy được nên phải thay thành 2 câu Dim Strym và Set Strym = CreateObject("ADODB.Stream").
Về dữ liệu nguồn thì trong trường hợp cụ thể này đã đảm bảo là UTF-8 nên code như vậy là ổn rồi ạ.
Có vẻ ADO chưa rành lắm Nhỉ ... Check cái đó nó có từ 2.x to 6.1 đấy
Untitled.png
 
Upvote 0
Bạn nào rảnh ... Nếu đam mê code thì nên bớt tẹo thời gian xem bài sau của Thành viên GPE ... ý tưởng hay ẩn chứa trong đó !!!
Code viết thêm các biến giả + abcdxyz + hahahaha :p :p _+)(9( Bài #9 )
 
Upvote 0
Web KT
Back
Top Bottom