2013-01-25 23 views
6

Tôi muốn nhập tệp CSV vào phiên bản 9.2 nhưng tệp CSV có dấu ngoặc kép kép ở vị trí cột cuối cùng để biểu thị giá trị NULL :không thể sao chép CSV vào bảng postgreSQL: cột dấu thời gian sẽ không chấp nhận chuỗi rỗng

"2","1001","9","2","0","0","130","","2012-10-22 09:33:07.073000000",""

được ánh xạ tới một cột kiểu Timestamp. postgreSQL không thích "". Tôi đã cố gắng để thiết lập tùy chọn NULL nhưng có lẽ tôi không làm điều đó một cách chính xác? Tôi đã thử NULL as '""NULL ''NULL as ''NULL "" nhưng không thành công; đây là lệnh của tôi:

COPY SCH.DEPTS 
FROM 'H:/backups/DEPTS.csv' 
WITH (
FORMAT CSV, 
DELIMITER ',' , 
NULL '', 
HEADER TRUE, 
QUOTE '"' 
) 

nhưng nó không thành công với một lỗi:

ERROR: invalid input syntax for type timestamp: ""

CONTEXT: COPY depts, line 2, column expirydate: ""

T.B. Có cách nào để chỉ định chuỗi đại diện của Booleans cho lệnh COPY? Tiện ích tạo ra các tệp CSV (trong đó có nhiều) được sử dụng "sai" và "đúng".

Trả lời

7

Chuỗi trống ("") không phải là dấu thời gian hợp lệ và COPY dường như không cung cấp chế độ FORCE NULL hoặc FORCE EMPTY TO NULL; nó có đảo ngược, FORCE NOT NULL, nhưng điều đó sẽ không làm những gì bạn muốn.

Bạn có thể cần phải COPY dữ liệu vào một bảng với một lĩnh vực text cho dấu thời gian, có thể là một bảng UNLOGGED hoặc TEMPORARY, sau đó sử dụng một INSERT INTO real_table SELECT col1, col, col3, NULLIF(tscol,'') FROM temp_table;.

COPY nên chấp nhận truefalse làm boolean, vì vậy bạn không nên gặp bất kỳ sự cố nào ở đó.

Cách khác, đọc CSV bằng tập lệnh Python đơn giản và mô-đun csv và sau đó sử dụng psycopg2 đến COPY hàng vào Pg. Hoặc chỉ cần viết CSV đã được dọn sạch mới và nạp vào COPY. Hoặc sử dụng công cụ ETL thực hiện chuyển đổi dữ liệu như Pentaho Kettle hoặc Talend.

+0

định dạng xuất này từ MSFT không giống bất kỳ CSV nào tôi đã thấy trước đó, ở chỗ nó trích dẫn tất cả các giá trị bất kể chúng là số hay chuỗi. Hầu như là họ đã làm cho việc xuất khẩu ít hữu ích về mục đích ;-) Nó gửi '" true "' không 'true' là tốt. Đã đến lúc dọn sạch hàng xuất khẩu. Cảm ơn những lời đề nghị của Kettle và Talend. – Tim