Lấy dữ liệu từ file Csv

Liên hệ QC

A Đặng

Thành viên mới
Tham gia
18/12/18
Bài viết
37
Được thích
2
Giới tính
Nam
Chào các Anh/Chị cùng các Bác của GPE.
Em đang có vấn đề mong được mọi người giúp đỡ :
Dữ liệu của em là các file csv với dung lượng lớn, bình thường em mở file csv lên rồi cốt kiếc xử lý các kiểu, nhưng do dung lượng file lớn nên cứ mỗi file thời gian mở cũng khá lâu. Do vậy khi mở lần lượt từng file thì cũng chiếm đáng kể thời gian!
Anh/Chị có biết giải pháp nào có thể lấy được dữ liệu từ csv vứt vào mảng, sau đó xử lý trên mảng ko cần mở file csv lên được không ạ!
Cám ơn Anh/Chị cùng các Bác rất nhiều!
 
Chào các Anh/Chị cùng các Bác của GPE.
Em đang có vấn đề mong được mọi người giúp đỡ :
Dữ liệu của em là các file csv với dung lượng lớn, bình thường em mở file csv lên rồi cốt kiếc xử lý các kiểu, nhưng do dung lượng file lớn nên cứ mỗi file thời gian mở cũng khá lâu. Do vậy khi mở lần lượt từng file thì cũng chiếm đáng kể thời gian!
Anh/Chị có biết giải pháp nào có thể lấy được dữ liệu từ csv vứt vào mảng, sau đó xử lý trên mảng ko cần mở file csv lên được không ạ!
Cám ơn Anh/Chị cùng các Bác rất nhiều!
Dùng ADO mở file ngầm là được mà.
 
Hiện tại chưa thấy cái file nào to bằng con kiến gửi lên cả..
 
Hiện tại chưa thấy cái file nào to bằng con kiến gửi lên cả..
Dạ. Tại vì dữ liệu trong công ty không mang ra ngoài được, nên cũng hơi bất tiện.
Chỉ nghiên cứu rồi lên công ty thực nghiệm thôi
Bài đã được tự động gộp:

Dùng ADO mở file ngầm là được mà.
Dạ ! Bác có thể giúp em một code ví dụ được không ạ.
Tại vì dữ liệu trong công ty không mang ra ngoài được, nên hơi bất tiện.
Trung bình file khoảng 6000 Column và 1000 Row. Liệu có ADO được không ạ.
Cám ơn rất nhiều !
 
6 000 000 (6 triệu ô), cũng đáng để thử, kkk ;)
 
6 000 000 (6 triệu ô), cũng đáng để thử, kkk ;)
Thử đi.
Tôi thì thấy không đáng. Cơ quan này bần tiện quá. Hàng khủng mà giao cho Excel(?) làm.
Lâu lâu một lần thì còn tạm chấp nhận. Theo thớt nói thì đây là hàng thường xuyên. Đây là công việc của SQL Server hoặc Oracle.

Mà phân tích dữ liệu kiểu này thì có lẽ phải là chuyên viên thống kê, dùng R hay Python; hoặc phần mềm chuyên như SAS, Stata...
 
Dạ. Tại vì dữ liệu trong công ty không mang ra ngoài được, nên cũng hơi bất tiện.
Chỉ nghiên cứu rồi lên công ty thực nghiệm thôi
Bài đã được tự động gộp:


Dạ ! Bác có thể giúp em một code ví dụ được không ạ.
Tại vì dữ liệu trong công ty không mang ra ngoài được, nên hơi bất tiện.
Trung bình file khoảng 6000 Column và 1000 Row. Liệu có ADO được không ạ.
Cám ơn rất nhiều !
Thử vào đường link này nghiên cứu xem. Xem từ mục I coi thế nào
 
VBA và FSO có thể dùng, code multithread được. Create các thread để đọc, parse csv file, còn giao tiếp giữa Excel và VBA cho chỉ mình thread chính của VBA và Excel.
Mỗi một ThreadProc nhận parameter là 1 path của 1 file csv, parse data vào 1 biến global dành riêng cho thread đó.
Dùng CriticalSection để lock, synchronize giữa các thread. Bật Event để báo main thread là thread con parse xong.
Bản thân Excel đã là multithread.
 
Lần chỉnh sửa cuối:
Vấn đề không phải là tốc độ.
Vấn đề ở đây là số cột. Con số này không phải là dữ liệu bảng tính. Nó là một matrix, trong R gọi nó là một DataFrame.

Cả ngàn cột đưa lên bảng tính thì mục đích là tính cái gì? Chỉ những loại phần mềm chuyên về DataFrame (hoặc BI) mới dễ dàng đọc theo kiểu lập phương.
 
Thử vào đường link này nghiên cứu xem. Xem từ mục I coi thế nào
Cám ơn Anh. E đã cố gắng thử FSO để đọc file CSV sau đó chia ra thành các mảng nhỏ. Rồi xử lý trên mảng. Nhưng không hiểu sao tốc độ nó lại còn chậm hơn việc mở file rồi xử lý ạ.
Bài đã được tự động gộp:

Vấn đề không phải là tốc độ.
Vấn đề ở đây là số cột. Con số này không phải là dữ liệu bảng tính. Nó là một matrix, trong R gọi nó là một DataFrame.

Cả ngàn cột đưa lên bảng tính thì mục đích là tính cái gì? Chỉ những loại phần mềm chuyên về DataFrame (hoặc BI) mới dễ dàng đọc theo kiểu lập phương.
Dạ. Không hiểu bác đang nói gì luôn. Cao siêu quá :((
 
Tránh các thao tác đọc tuần tự trên file. Truy xuất IO rất chậm. Nên đọc hết file content lên bộ nhớ, parse xong giải phóng liền.
6 triệu cell, giả sử mỗi cell có data là kiểu string khoảng 20 char, tức khoảng 46 byte, thì cả file khoảng 270 MB memory, không lớn lắm.
Còn kg thì dùng memory mapped file API, nhưng với VBA thì hơi phiền phức
 
Lần chỉnh sửa cuối:
Tránh các thao tác đọc tuần tự trên file. Truy xuất IO rất chậm. Nên đọc hết file content lên bộ nhớ, parse xong giải phóng liền.
6 triệu cell, giả sử mỗi cell có data là kiểu string khoảng 20 char, tức khoảng 45 byte, thì cả file khoảng 270 MB memory, không lớn lắm
Nó thì trình tự như thế nào ạ.?
 
Cậu post đoạn code của cậu lên, xem cậu đọc file ra sao. Đọc file thì có vô số cách đọc
 
dữ liệu CSV trung bình 30Mb với 6000 Col x 1000 Row
em sử dụng cú pháp Bác hình dung như sau ạ.
Mã:
Dim Fso As New Scripting.FileSystemObject
    Dim Source As Object
    Dim Arr
    Dim Rng
    Dim i, j, x As Integer
    Dim StrPath As String
       
        StrPath = "Duong dan file"
        Set Source = Fso.OpenTextFile(StrPath)
        Arr = Split(Source.ReadAll, vbCrLf)
        '/Vì dữ liệu 1000 Row nên sau khi Get Arr e phải phân ra 1000 mảng nhỏ Rng/'
        ReDim Rng(0 To UBound(Arr))
        For i = 0 To UBound(Arr)
            Rng(i) = Split(Arr(i), ",")
        Next i
        '/Từ đây e mới đi xử lý các mảng nhỏ Rng/'
 
Cậu bị memory leak rồi. Cạn memory sẽ làm Vba, excel ì ạch. Mọi người dùng Vba hay bỏ quên lỗi này, do nghĩ Vba làm hết
1. ReadAll trả về string, Split nó theo vbCrLf xong phải vbNullString nó ngay
2. Array trả về từ Split vbcrlf dùng xong phải Erase ngay. Nó chiếm 6 triệu x 16byte memory đấy, vì array của cậu là array của variant item.
Code cậu có thể chậm chỗ khác. Dùng cách đo time để tìm ra cho mình chỗ chậm
 
Cậu bị memory leak rồi. Cạn memory sẽ làm Vba, excel ì ạch. Mọi người dùng Vba hay bỏ quên lỗi này, do nghĩ Vba làm hết
1. ReadAll trả về string, Split nó theo vbCrLf xong phải vbNullString nó ngay
2. Array trả về từ Split vbcrlf dùng xong phải Erase ngay. Nó chiếm 6 triệu x 16byte memory đấy, vì array của cậu là array của variant item.
Code cậu có thể chậm chỗ khác. Dùng cách đo time để tìm ra cho mình chỗ chậm
Em không hiểu lắm ạ.
Bác có thể tối ưu nó bằng code như thế nào để dễ hình dung hơn được không?
 
Không data, kg code của cậu thì tối ưu bằng gì bạn? Ở trên tui đã nói rõ rồi mà.
Tui đang 8 bằng đt, nên kg tìm được bài cũ của tui. Ongke post giúp cái, cảm ơn
 
Không data, kg code của cậu thì tối ưu bằng gì bạn? Ở trên tui đã nói rõ rồi mà.
Tui đang 8 bằng đt, nên kg tìm được bài cũ của tui. Ongke post giúp cái, cảm ơn
Phần code của e có trình bày rồi đấy ạ.
Phần code còn lại chỉ là phần tính toán khi đã có Array thôi.
Ngoài ra thì em đã trình bày ở #1 do Data trong công ty không thể mang ra được.
Nên xin cám ơn sự giúp đỡ rất nhiều !
 
Cậu đo time từng đoạn để tìm đoạn nào trong hàm gây chậm
 
Web KT
Back
Top Bottom