Các xử lý dấu phẩy (,) khi ghi file *.csv"

Nơi trao đổi về VBA (Visual Basic for Application), lập trình cho ứng dụng Microsoft Office, AutoCAD...

Moderator: tungblt

Post Reply
conso0va0
Thành viên chính thức
Thành viên chính thức
Posts: 10
Joined: Thu 26/08/2010 3:53 pm
Has thanked: 2 times

Các xử lý dấu phẩy (,) khi ghi file *.csv"

Post by conso0va0 »

Biết rằng file 9*.csv có thể mở trên Excel với các cột tương ứng bởi dấy phẩy (,) khi xem file trên Notepad. Như vậy, mình gặp khó khăn trong quá trình ghi file *.csv là vấn đề trong 1 trường (cột) của csv có chứa nhiều dấy phẩy. Ví dụ :
STT, Hovaten, Quequan
1, Nguyễn Văn A, Hải Dương
2, Nguyễn Văn B, Thanh Xuân, Hà Nội
Mình đang mong muốn thông tin "Thanh Xuân, Hà Nội" được gắn với trường Quequan nhưng mà bình thường viết như trên thì "Thanh Xuân" ở trong trường Quequan còn Hà Nội nhảy sang dòng bên cạnh.
Vậy xin các cao nhân có thể chỉ dẫn giúp mình giải quyết vấn đề này được không. Mình code chức năng lưu *.csv trong bằng Visual Basic.
Xin cảm ơn !
conso0va0
Thành viên chính thức
Thành viên chính thức
Posts: 10
Joined: Thu 26/08/2010 3:53 pm
Has thanked: 2 times

Re: Các xử lý dấu phẩy (,) khi ghi file *.csv"

Post by conso0va0 »

Em đã giải quyết được vấn đề này bằng cách dùng Tab thay cho cách dùng dấu phẩy (,) để phân cách giữa các trường. Xin cảm ơn mọi người !
chipmunk
Thành viên tích cực
Thành viên tích cực
Posts: 125
Joined: Mon 28/03/2011 9:19 am
Has thanked: 2 times
Been thanked: 5 times

Re: Các xử lý dấu phẩy (,) khi ghi file *.csv"

Post by chipmunk »

Bao bọc thành
STT, Hovaten, Quequan
1, Nguyễn Văn A, Hải Dương
2, Nguyễn Văn B, "Thanh Xuân, Hà Nội"
User avatar
truongphu
VIP
VIP
Posts: 4781
Joined: Sun 04/11/2007 10:57 am
Location: Cam Đức, Khánh hòa
Has thanked: 14 times
Been thanked: 525 times

Re: Các xử lý dấu phẩy (,) khi ghi file *.csv"

Post by truongphu »

conso0va0 wrote:Em đã giải quyết được vấn đề này bằng cách dùng Tab thay cho cách dùng dấu phẩy (,) để phân cách giữa các trường. Xin cảm ơn mọi người !
Rất tốt.
Tôi có theo dõi mạch thảo luận của bạn về Excel và CSV
Bạn xử lý đúng, nhưng tôi nghi bạn làm bằng tay :D
*** Khi Excel lưu ra file csv, chúng căn cứ vào registry mà định dạng
Do đó, bạn có thể edit registry để thực hiện công việc nhanh
đó là nhánh: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Jet\4.0\Engines\Text

Xem bài:
Hướng dẫn ADODB đọc file text
http://www.caulacbovb.com/forum/viewtop ... 726#p81637
o0o--truongphu--o0o

.........
Ghé thăm:
Chuyện Linh Tinh
conso0va0
Thành viên chính thức
Thành viên chính thức
Posts: 10
Joined: Thu 26/08/2010 3:53 pm
Has thanked: 2 times

Re: Các xử lý dấu phẩy (,) khi ghi file *.csv"

Post by conso0va0 »

Cảm ơn bác truongphu, đúng là ý tưởng đó em mới thực hiện bằng tay, chưa viết code. Hôm nay, tiến hành viêt code em mới thấy gặp khó khăn là không biết viết ký tự "tab" bằng vb như thế nào để đúng với định dạnh của *.csv. Trong bài viết mà bác gửi có cách khai báo tab là:

Code: Select all

Const HKEY_LOCAL_MACHINE = &H80000002
strComputer = "."
Set objReg=GetObject("winmgmts:\\" & strComputer & _
    "\root\default:StdRegProv")
strKeyPath = "SOFTWARE\Microsoft\Jet\4.0\Engines\Text"
strValueName = "Format"
strValue = "TabDelimited"
objReg.SetStringValue HKEY_LOCAL_MACHINE,strKeyPath,strValueName,strValue
Sau khi khai báo phần đó thì sẽ sử dụng như thế nào? Ví dụ cần viết 1 dòng bản ghi csv bắng strinh của VB:
Cột 1 (Tab) Cột 2 (Tab) Cột 3
Xin bác tư vấn em thêm về vấn đề của là em đang cần lưu nội dung của nhiều worksheet trong workbook đang làm việc về file *.scv (kiểu như backup dữ liệu) sau đó người dùng vẫn làm việc trên workbook hiện hành bình thường (không có gì thay đổi). Dữ liệu của các worksheet cần lưu về *.csv là rất lớn cần thuật toán nhanh gọn và sẽ viết trên VB 6.0 (tạo dll) chứ không phải bằng VBA.
Em đã thử làm bằng phương thức Save As (workbook hay worksheet về *.csv rồi nhưng cách này không ổn như đã trình bày ở bài viết khác mà bác cũng thảo luận).
Xin cảm ơn !
Last edited by conso0va0 on Fri 08/04/2011 11:11 am, edited 1 time in total.
conso0va0
Thành viên chính thức
Thành viên chính thức
Posts: 10
Joined: Thu 26/08/2010 3:53 pm
Has thanked: 2 times

Re: Các xử lý dấu phẩy (,) khi ghi file *.csv"

Post by conso0va0 »

chipmunk wrote:Bao bọc thành
STT, Hovaten, Quequan
1, Nguyễn Văn A, Hải Dương
2, Nguyễn Văn B, "Thanh Xuân, Hà Nội"
Nếu xử lý bằng cách này thì làm sao viết được dấu "nháy nháy" (") bằng vb để nó phấn biệt với dấu "nháy nháy" thể hiện nội dung ký tự ("string") ạ? Mình thử bằng tay thì cách này của bạn không thực hiện được. "Thanh xuân ở 1 cột và Hà Nội" ở 1 cột khác nhau.
User avatar
truongphu
VIP
VIP
Posts: 4781
Joined: Sun 04/11/2007 10:57 am
Location: Cam Đức, Khánh hòa
Has thanked: 14 times
Been thanked: 525 times

Re: Các xử lý dấu phẩy (,) khi ghi file *.csv"

Post by truongphu »

Chủ đề nầy cũng khá
vì liên quan VBA/Excel, chuyển trả lại về Box VBA
conso0va0 wrote:Trong bài viết mà bác gửi có cách khai báo tab là:
Đó là tôi nhớ nhầm; các khai báo tab hay comma dùng cho jet của ado, xin lỗi nha
conso0va0 wrote:em mới thực hiện bằng tay, chưa viết code. Hôm nay, tiến hành viêt code em mới thấy gặp khó khăn là không biết viết ký tự "tab" bằng vb như thế nào để đúng với định dạnh của *.csv.
Cũng đơn giản: bạn lệnh cho sheet saveas thành file TXT, đương nhiên ngăn cách sẽ là TAB
còn file CSV (Comma-separated values) thì đương nhiên là dấu comma rồi
=> sau khi có file TXT, hãy RENAME đuôi thành csv
conso0va0 wrote:Dữ liệu của các worksheet cần lưu về *.csv là rất lớn cần thuật toán nhanh gọn và sẽ viết trên VB 6.0 (tạo dll) chứ không phải bằng VBA.
Em đã thử làm bằng phương thức Save As (workbook hay worksheet về *.csv rồi nhưng cách này không ổn như đã trình bày ở bài viết khác
Không ra sao cả
Tôi đã hướng dẫn viết code lưu hàng loạt rồi, VBA cũng là VB6 có chèn excel, code như nhau

Code: Select all

        For i = 1 To .Worksheets.Count
            .Worksheets(i).SaveAs Filename:=ThisWorkbook.Path & "\" & _
            Worksheets(i).Name & ".csv", FileFormat:=xlCSV
        Next
Attachments
SA-CSV.rar
(6.96 KiB) Downloaded 383 times
o0o--truongphu--o0o

.........
Ghé thăm:
Chuyện Linh Tinh
conso0va0
Thành viên chính thức
Thành viên chính thức
Posts: 10
Joined: Thu 26/08/2010 3:53 pm
Has thanked: 2 times

Re: Các xử lý dấu phẩy (,) khi ghi file *.csv"

Post by conso0va0 »

Ở trong ví dụ trên anh sử dụng tên file lưu = tên sheet (Worksheets(i).Name & ".csv") như vậy anh không nhìn thấy sự thay đổi workbook. Anh xem lại file đính kèm em vừa sửa 1 chút về ví dụ của anh sẽ thấy điều em cần diễn giải.
=============================================================
Hiện tại em đang định hướng giải quyết vấn đề em vừa diễn giải bằng các đọc dữ liệu từng trường, từ ô trong File Excel, sau đó ghi nội dung vào file dulieu.txt (theo cấu trúc khi file csv) . Sau đó, đổi tên file dulieu.txt thành dulieu.csv.
Khó khăn đang gặp phải là:
- Dùng cách nào để ngăn cách các trường mà vẫn viết được nội dung trong 1 trường bao gồm cả dấu phẩy (,) (ví dụ : thôgn tin trường Quequan là: "Nguyễn Trãi, Thanh Xuân, Hà Nội").\
- Vấn đề nữa là làm sao ghi và lưu được file dulieu.txt ở trên ở dạng unicode? -> Khi xem file dulieu.csv trên excel thấy rõ được các chữ mã unicode.

Code: Select all

Dim fso, MyFile
Set fso = CreateObject("Scripting.FileSystemObject")
Set MyFile = fso.CreateTextFile(fPath & "" & fileName & ".txt", True)
        Do While data <> "" And data <> 0 And data <> "0"
                sRecord = ""
                For j = 1 To 4
                    data = Worksheets("TenSheet.csv").Cells(i, j).Value
                    sRecord = sRecord & data & ","
                Next
                MsgBox sRecord
                MyFile.WriteLine sRecord 'Báo lỗi (invalid procedure call or argument
) ở đây khi nội dung từ Excel đưa sang có chứa mã unicode
                i = i + 1
         Loop
MyFile.Close
Cách khác :

Code: Select all

Open fPath & "" & fileName & ".txt" For Binary As #iFileNo
        Do While data <> "" And data <> 0 And data <> "0"
                sRecord = ""
                For j = 1 To 4
                    data = Worksheets("TenSheet.csv").Cells(i, j).Value
                    sRecord = sRecord & data & ","
                Next
                Print #iFileNo, sRecord ' Báo lỗi Bad file Mode
                i = i + 1
        Loop
Close #iFileNo
Xin các anh chị tư vấn thêm ạ !
Attachments
SA-CSV2.zip
(8.54 KiB) Downloaded 334 times
Post Reply

Return to “Visual Basic for Application (VBA)”