2017-05-28 45 views
0

我需要導入一個CSV文件到Postgres(版本9.6.3),我需要幫助理解最好的方法來做到這一點。使用包含毫秒的datetime字段將CSV文件導入Postgres?

CSV的格式如下所示,同時也瞭解實際導入文件的最佳方式,我也不確定數據類型是否應該用於存儲'time'字段包含毫秒,被格式化爲「YYYY.MM.DD HH:MM:SS.MS」

Time,Col1,Col2,Col3,Col4 
2017.05.01 00:00:02.851,1.09062,1.09057,4.35,5.42 
2017.05.01 00:00:03.368,1.09062,1.09058,3.22,1 
... 

我有pgAdmin的客戶端,以便可以使用,但我也願意使用原始SQL命令行或使用Python(Python 3.6)創建表並導入數據。

我想導入的文件大小範圍從20mbs到幾百mbs不等,所以我想找到最快的方法。

任何幫助或指針,非常感謝。

謝謝!

回答

1

您的表可能看起來像這樣(選擇的列numeric types之一):

create table my_table(
    time timestamp, 
    col1 numeric, 
    col2 numeric, 
    col3 numeric, 
    col4 numeric); 

使用copy command,如:

copy my_table from '/data/my_file.csv' (format csv, header); 

select * from my_table; 

      time   | col1 | col2 | col3 | col4 
-------------------------+---------+---------+------+------ 
2017-05-01 00:00:02.851 | 1.09062 | 1.09057 | 4.35 | 5.42 
2017-05-01 00:00:03.368 | 1.09062 | 1.09058 | 3.22 | 1 
(2 rows) 

如果該文件是非常大的,你可以將其導入到未記錄的表格,然後在該表格上進行記錄(請參閱alter table)。這可以減少導入的時間。

alter table my_table set unlogged; 
copy my_table from '/data/my_file.csv' (format csv, header); 
alter table my_table set logged; 

擁有Postgres的操作系統用戶必須具有該文件的讀取權限。

+0

謝謝Klin,如果一切順利的話,我會盡快對此進行測試並標記爲'正確答案'。我不確定CVS文件中的時間字段的格式是否會導入,如您的示例中顯示的YYYY MM等使用破折號' - '分隔,但是在我的CSV中使用了句號/句點''。 - 我希望這不會導致任何問題,並會在導入過程中轉換...感謝您的幫助,我很感激... –

+1

我剛剛測試過這個,它應該工作。 – klin

+0

你是一位絕對的明星,謝謝! –