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:
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
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.


