2017-03-29 38 views
0

我有一個2550列的csv文件,我想將它導入到PostgreSQL中。將大量csv導入postgreSQL中

爲了在postgreSQL中首先導入csv,我應該創建表格並使用\copy從csv複製到表格。但是如果表中有大量像我的情況那樣的列,我無法手動創建表。

任何解決方案?

更新

數據結構如下: DZ(01),直到DZ(2550)基本上之間-50至+50:

id | date | time  | localtime | pid | dZ(0)..dZ(1)......dZ(2550)| 
---|---------|-----------|-----------|-----|---------------------------| 
17|11-11-2014| 16:33:21 | 1.45E+15 |2375 |0 0 0 0 0 -1 0 -1 0 -5 -10| 

CSV結構:(I使用的「 ';'delimiter)

17;13-11-2014;08:09:37;1.45E+15;4098;0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -4 3 0 -2 3 -2 1 0 0 1 1 3 -2 3 4 2 -2 -2 .... 

這是一行數據。

+3

我怕你被限制在表中的1600列,所以你可能需要嘗試設置自定義分隔符並將整行導入爲一列,所以稍後您可以選擇'split_part'或正則表達式切換到服務器鋁柱。但無論如何,你將無法將全部2550導入到同一張表 –

+4

每條線有多大?也許你可以將它導入到只有一個「文本」列的表中並在數據庫中處理它。在關係數據庫中,具有許多列的表格沒有多大意義。 –

+0

看起來像重複組。也許把它存儲到數組中?順便說一句:日期+時間應該是一個(時間戳)字段。 – wildplasser

回答

3

導入dZ列到文本列,後來把它變成一個數組:

創建臨時表:

create table s (
    id int, 
    date date, 
    time time, 
    localt double precision, 
    pid int, 
    dz text 
); 

設置日期風格:

set datestyle = 'DMY'; 

導入到臨時表;

\copy s from '/home/cpn/codigo/file.csv' with (format csv, delimiter ';') 

創建明確的表合併的日期和時間成時間戳和車削dZ到一個數組:

create table t (
    id int, 
    datetime timestamp, 
    localt double precision, 
    pid int, 
    dz integer[] 
); 

填充最終從臨時:

insert into t (id, datetime, localt, pid, dz) 
select 
    id, date + time, localt, pid, 
    regexp_split_to_array(dz, '\s')::int[] 
from s 
+0

表中包含2500列的氣味不好!我喜歡你的陣列解決方案。也許目標表結構應該規範化,每行有1個值。除非陣列真的有意義。 – peufeu

+0

我試過這個解決方案,但數組在s和t表中都是空的我用數據結構更新了我的問題,有什麼想法? – User193452

+0

@Safariba我會在稍後檢查。 –