Thông tin

Thao tác với file Txt có dung lượng thật lớn

Các thủ thuật liên quan đến xử lý chuỗi và thời gian

Điều hành viên: truongphu

Thao tác với file Txt có dung lượng thật lớn

Gửi bàigửi bởi truongphu » T.Năm 20/05/2010 2:55 pm

Thủ thuật: Thao tác với file Txt có dung lượng thật lớn
Tác giả: truongphu
Mô tả: Thao tác với file Txt có dung lượng thật lớn



* Trong thực tế chúng ta đang làm việc với các file Txt có định dạng Font Unicode, (không nói đến file txt UTF-8). File ANSI hầu như xưa rồi, chỉ gặp với tiếng Anh, Pháp...
Vì lý do trên, dù VB6 có kỹ thuật đọc file Unicode, nhưng đơn giản nhất và trực quan, chúng ta hãy dùng Scripting Runtime:
Mã: Chọn tất cả
        Set fso = CreateObject("Scripting.FileSystemObject")
        Set a = fso.OpenTextFile(objDialog.FileName, 1, , -2)

- nếu chỉ lệnh: Set a = fs.OpenTextFile(objDialog.FileName) thì đấy là mở file txt ANSI
- các đối số 1, ,-2 cho phép đọc file txt Unicode

* Thông thường ta có thói quen mở file txt và đọc toàn bộ file vào một TextBox MS 2.0 vì TextBox nầy hổ trợ Unicode, mà MS Office thì phần lớn máy tính đều được cài, do đó khỏi cần mang theo ocx mất công.
Lệnh Scripting Runtime thật đơn giản: ReadAll nên tạo thói quen dùng
Mã: Chọn tất cả
                TextBox1 = a.ReadLine

Không thể nào đơn giản hơn! VB6 buộc phải đọc qua một biến trung gian String, sau đó mới được phép gán kết quả cho TextBox. Ở đây, TextBox nhận kết quả trực tiếp luôn

* Và điều phải đến sẽ đến: Với File Txt có dung lượng cỡ năm mười MB, khi mở file, project nhá một cái rồi ì ạch, ngồi đợi mãi... đến khi click chuột vào mới nhận thông báo: Not Responding. Hoặc khi thao tác với các hàm trên file có dung lượng nhỉnh hơn, vài MB, Not Responding lại xuất hiện hoặc có làm việc được cũng rất lâu.
Lý do: quá mức tải của TextBox, hoặc chỉ với 1 lệnh, VB6 đã phải duyệt TextBox tức là duyệt qua vài MB. Nếu rất nhiều lệnh như trong vòng lặp: thua là phải!

Vậy thì ta phải làm gì? Rất đơn giản: Từ bỏ thói quen ReadAll để chuyển qua ReadLine
-> Ta định nghĩa một mảng String, cứ độ 1000 dòng thì cho vào một biến của mảng:
Mã: Chọn tất cả
             Dim Mang(99) As String
   Mang(17) = Mang(17) & a.ReadLine

-> để tính 1000 dòng, ta cho 2 biến số làm nhiệm vụ nầy
Mã: Chọn tất cả
   Dim i as Long, j as Long
   j = i \ 1000


Code toàn vẹn như sau:

Syntax: [ Download ] [ Hide ]
Using vb Syntax Highlighting
        Dim Mang(99) As String
        Dim i&, j&
        Set fs = CreateObject("Scripting.FileSystemObject")
        Set a = fs.OpenTextFile(objDialog.FileName, 1, , -2)
            Do Until a.AtEndOfStream  ' code truongphu
               j = i \ 1000
                Mang(j) = Mang(j) & a.ReadLine
         i = i + 1
            Loop
        a.Close: Set a = Nothing
Parsed in 0.004 seconds, using GeSHi 1.0.8.4


Ta có thể tăng giảm phần tử của mảng, tăng giảm số dòng đọc của biến... cứ như thế, file Txt dù có lớn cỡ nào, công việc vẫn tiến hành nhanh chóng.
truongphu@caulacbovb.com
Hình đại diện của thành viên
truongphu
Support Group Leader
Support Group Leader
 
Bài viết: 3352
Ngày tham gia: CN 04/11/2007 10:57 am
Đến từ: Thị trấn Cam Đức, H Cam Lâm, Khánh hòa

Re: Thao tác với file Txt có dung lượng thật lớn

Gửi bàigửi bởi tienlbhoc » T.Năm 08/07/2010 11:17 am

Ngoài ra có thể dùng cách là dùng stream đọc 1 block byte rồi convert ra utf-8 ở 1 vị trí bất kỳ (dùng seek) , thêm thanh cuốn nữa thì sẽ ổn, cuốn được từ đầu đến cuối
Diễn đàn và blog phần mềm tự làm :
http://my.opera.com/DienDanTienlbhoc/forums/
http://my.opera.com/tienlbhoc/blog/
tienlbhoc
Thành viên trung thành
Thành viên trung thành
 
Bài viết: 409
Ngày tham gia: T.Bảy 14/07/2007 10:06 pm
Đến từ: Hà Nội


Quay về [VB6] Chuỗi và Thời gian

Đang trực tuyến

Đang xem chuyên mục này: Không có thành viên nào trực tuyến.0 khách.