• Vui lòng đọc nội qui diễn đàn để tránh bị xóa bài viết
  • Tìm kiếm trước khi đặt câu hỏi

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
Hình đại diện của người dùng
truongphu
VIP
VIP
Bài viết: 4756
Ngày tham gia: CN 04/11/2007 10:57 am
Đến từ: Cam Đức, Khánh hòa
Has thanked: 14 time
Been thanked: 509 time

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 hết

        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 hết

                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 hết

             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 hết

   Dim i as Long, j as Long
   j = i \ 1000


Code toàn vẹn như sau:

  1.         Dim Mang(99) As String
  2.         Dim i&, j&
  3.         Set fs = CreateObject("Scripting.FileSystemObject")
  4.         Set a = fs.OpenTextFile(objDialog.FileName, 1, , -2)
  5.             Do Until a.AtEndOfStream  ' code truongphu
  6.                j = i \ 1000
  7.                 Mang(j) = Mang(j) & a.ReadLine
  8.      i = i + 1
  9.             Loop
  10.         a.Close: Set a = Nothing


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.


o0o--truongphu--o0o

.........
Ghé thăm:
Chuyện Linh Tinh

tienlbhoc
Thành viên tâm huyết
Thành viên tâm huyết
Bài viết: 415
Ngày tham gia: T.Bảy 14/07/2007 10:06 pm
Đến từ: Hà Nội
Been thanked: 1 time

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/

thinh18tt
Mạnh Thường Quân
Mạnh Thường Quân
Bài viết: 167
Ngày tham gia: T.Ba 18/05/2010 11:49 pm
Has thanked: 7 time

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

Gửi bàigửi bởi thinh18tt » T.Ba 05/04/2011 12:19 pm

truongphu đã viết: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



Code toàn vẹn như sau:

  1.         Dim Mang(99) As String
  2.         Dim i&, j&
  3.         Set fs = CreateObject("Scripting.FileSystemObject")
  4.         Set a = fs.OpenTextFile(objDialog.FileName, 1, , -2)
  5.             Do Until a.AtEndOfStream  ' code truongphu
  6.                j = i \ 1000
  7.                 Mang(j) = Mang(j) & a.ReadLine
  8.      i = i + 1
  9.             Loop
  10.         a.Close: Set a = Nothing

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.


Chào bác Phú!
Hôm nay em lại có việc muốn được bác chỉ giáo.
Em có file text có dung lượng min = 100MB, các trường cách nhau bởi 1 khoảng trống (text ANSI). Em muốn đưa nó vào mdb để tính toán, vậy có thể làm dựa trên cách của bác hay không? Và nếu được thì có mất nhiều thời gian không? Hoặc có cách nào khả quan nhất, mong bác chỉ giúp em.

Hình đại diện của người dùng
truongphu
VIP
VIP
Bài viết: 4756
Ngày tham gia: CN 04/11/2007 10:57 am
Đến từ: Cam Đức, Khánh hòa
Has thanked: 14 time
Been thanked: 509 time

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

Gửi bàigửi bởi truongphu » T.Ba 05/04/2011 2:37 pm

thinh18tt đã viết:các trường cách nhau bởi 1 khoảng trống (text ANSI).

** Đọc file text ansi thì dùng VB6 cổ điển Open.. For.. As.. để nhanh hơn; nhưng yêu cầu các trường (ghi trên file) có độ dài cố định, khi ấy ta mở file theo As Binary và Get ở địa chỉ đã xác định, đọc vào một biến String cũng có độ dài xáx định = tổng byte các trường, lần lượt cho đến hết
** Nếu các trường (ghi trên file) có độ dài khác nhau, thì mở file theo As Input
**** Vì không yêu cầu đọc toàn bộ nên ta không cần dùng mảng như trên, ta cứ đọc từng dòng, tách các trường và cho Recordset AddNew và Update
Có thể chậm
----

Trên đây là trả lời theo ý bạn
Thật ra ADODB có thể truy xuất file TXT, bạn tìm trong Box Tài Nguyên tôi có viết 1 bài cụ thể.
Sau khi Recordset mở tốt, bạn có thể lưu lại dữ liệu nầy trên file mdb, làm thế thì nhanh hơn.
Nếu thắc mắc tiếp, xin ra Box Thảo luận
o0o--truongphu--o0o

.........
Ghé thăm:
Chuyện Linh Tinh

thinh18tt
Mạnh Thường Quân
Mạnh Thường Quân
Bài viết: 167
Ngày tham gia: T.Ba 18/05/2010 11:49 pm
Has thanked: 7 time

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

Gửi bàigửi bởi thinh18tt » T.Ba 05/04/2011 7:23 pm

Cảm ơn bác Phú, em sẽ tìm hiểu và báo cáo bác sau.


Quay về “[VB] 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.1 khách