2017-03-29 3 views
0

私は2550カラムのcsvファイルを持っており、postgreSQLにインポートします。多くのカラムを持つ大きなcsvをpostgreSQLにインポート

最初にpostgreSQLでcsvをインポートするには、テーブルを作成して、\copyを使用してcsvからテーブルにコピーしてください。私の場合のようにテーブルに膨大な量のカラムがあると、テーブルを手動で作成することはできません。

どのような解決策ですか?

更新

データ構造は以下の通りである:dZと(2550)まで dZと(01)+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 'を使用';'デリミタ)

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 .... 

これは1行のデータです。

+3

は、私はあなた怖い

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

は、タイムスタンプに日付と時刻をマージし、配列にdZを回し決定的なテーブルを作成します。テーブルでは1600列に制限されているので、カスタムの区切り文字を設定して行全体を1つの列としてインポートしようとします。後で 'split_part'またはregexをseverに選択できますすべての列。しかし、とにかく、すべての2550を同じテーブルにインポートすることはできません。 –

+4

各行はどれくらいの大きさですか?たぶんあなたはそれを1つの 'text'カラムだけを持つテーブルにインポートし、それをデータベースで処理することができます。多くの列を持つテーブルは、リレーショナルデータベースではあまり意味がありません。 –

+0

繰り返しグループのように見えます。多分それを配列に格納しますか? BTW:日付+時間は1(タイムスタンプ)フィールドでなければなりません。 – wildplasser

答えて

3

インポート配列にそれを回す、後でテキスト列に変換し、dZコラム:

一時テーブルを作成します。

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

設定した日付スタイル:

set datestyle = 'DMY'; 

インポートに一時テーブル。

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行に1つの値を持つように正規化する必要があります。アレイが本当に意味をなさない限り。 – peufeu

+0

私はこのソリューションを試してみましたが、配列はsテーブルとtテーブルの両方で空です。データ構造で質問を更新しました。 – User193452

+0

@Safariba後で確認します。 –

関連する問題