Tạo Schema.ini cho file csv cho cột chứa giá trị không đồng nhất

Liên hệ QC

evolt

Thành viên mới
Tham gia
14/6/13
Bài viết
27
Được thích
4
Chào anh chị, mình có file CSV khoảng 3 triệu record, có cột [Số đơn hàng] chứa giá trị trong range 5M, tuy nhiên lại lọt chọt vài [số đơn hàng] có giá trị trong range 3B.

Nếu file Schema.ini để mặc định MaxScanRows= 8 thì ADO sẽ trả giá trị null cho các record 3B này.

Mình có đổi MaxScanRows=3000000 thì chạy ok nhưng cực kỳ chậm cho phải scan nhiều, mình có check thì báo định dạng DataType = AdDouble, sau đó mình thay đổi Schema.ini bằng cách định nghĩa [Col=2"Số đơn hàng" Double] nhưng vẫn bị null các record 3B.

Nhờ anh chị hướng dẫn set file này sao cho đúng ạ

datatype.png
 
Chào anh chị, mình có file CSV khoảng 3 triệu record, có cột [Số đơn hàng] chứa giá trị trong range 5M, tuy nhiên lại lọt chọt vài [số đơn hàng] có giá trị trong range 3B.

Nếu file Schema.ini để mặc định MaxScanRows= 8 thì ADO sẽ trả giá trị null cho các record 3B này.

Mình có đổi MaxScanRows=3000000 thì chạy ok nhưng cực kỳ chậm cho phải scan nhiều, mình có check thì báo định dạng DataType = AdDouble, sau đó mình thay đổi Schema.ini bằng cách định nghĩa [Col=2"Số đơn hàng" Double] nhưng vẫn bị null các record 3B.
- Bạn dùng Provider nào? dùng cái này xem: Provider=Microsoft.ACE.OLEDB.12.0
- Dùng Scheme.ini với Col=2 "So Don Hang" TExt xem thử. Còn range 5M, 3B thì tôi không hiểu rồi.
 
Lần chỉnh sửa cuối:
- Bạn dùng Provider nào? dùng cái này xem: Provider=Microsoft.ACE.OLEDB.12.0
- Dùng Scheme.ini với Col=2 "So Don Hang" TExt xem thử.
- Mình dùng với Provider=Microsoft.ACE.OLEDB.16.0;
- Đã thử bằng text/char/memo/binary các kiểu nhưng vẫn không được. Mà Schema.ini mình encode bằng UTF-16L, viết tên cột có dấu luôn thì có ảnh hưởng gì không nhỉ? (File CSV cũng là tiếng việt có dấu)
schema.png


Nãy mình mới thay "MaxScanRows=3000000" thành "MaxScanRows=0" thì nó chạy nhanh hơn hẳn mà vẫn ra kết quả đúng, ko cần định nghĩa từng cột. Nhưng mình vẫn muốn tìm hiểu vì sao định nghĩa như vậy lại không hoạt động.
 
- Bạn dùng Provider nào? dùng cái này xem: Provider=Microsoft.ACE.OLEDB.12.0
- Dùng Scheme.ini với Col=2 "So Don Hang" TExt xem thử. Còn range 5M, 3B thì tôi không hiểu rồi.
À để mình giải thích rõ chỗ range 5M/3B. Cột [số đơn hàng] có giá trị quanh quanh 5,000,000 (chỉ có vài đơn đặc biệt sẽ được đánh dấu bằng số 3,000,000,000) nên nếu không set MaxScanRows thì ADO sẽ tự định nghĩa cột này là Integer, sau đó giá trị [Số Đơn hàng] 3 tỷ kia sẽ bị null do nó là kiểu double

integer.png
Hình ở pos #1 anh @ongke0711 sẽ thấy nó là Double, có giá trị 3.1B
 
- Mình dùng với Provider=Microsoft.ACE.OLEDB.16.0;
- Đã thử bằng text/char/memo/binary các kiểu nhưng vẫn không được. Mà Schema.ini mình encode bằng UTF-16L, viết tên cột có dấu luôn thì có ảnh hưởng gì không nhỉ? (File CSV cũng là tiếng việt có dấu)


Nãy mình mới thay "MaxScanRows=3000000" thành "MaxScanRows=0" thì nó chạy nhanh hơn hẳn mà vẫn ra kết quả đúng, ko cần định nghĩa từng cột. Nhưng mình vẫn muốn tìm hiểu vì sao định nghĩa như vậy lại không hoạt động.
- MaxScanRows=0 là nó cũng quét hết dòng đó chứ.
- Còn về file Schema.ini tôi thấy bạn viết sai rồi. Lưu UTF-8 cũng được mà.
- Chuỗi kết nối thì dùng IMEX=1

Mã:
MaxScanRows=0
CharacterSet=65001  'UTF-8
Col1="Số Đơn Hàng" Double
Col2="..."  ...
...
 
"- MaxScanRows=0 là nó cũng quét hết dòng đó chứ." - Dạ đúng rồi, nhưng em không hiểu sao nó lại trả kết quả datatype = text cho toàn bộ các cột nếu để maxscanrows=0 và IMEX=1

"- Còn về file Schema.ini tôi thấy bạn viết sai rồi. Lưu UTF-8 cũng được mà." - Chỗ này UTF-8 hay 16 không ảnh hưởng ạ, file CSV em dùng cũng có file UTF-8/UTF-16 đều đọc được thoải mái, em đang tìm hiểu về BOM, khi nào cần BOM khi nào không ạ?


Lỗi của em khiến file Schema sai là em viết "Col=1" thay vì "Col1=" ạ :D nhìn mãi mới ra, viết lại đúng thì Schema chạy ngon lành rồi ạ. Cám ơn a @ongke0711 nhiều.
 
Web KT
Back
Top Bottom