質問: ### 前提・実現したいこと 以下のような、カラム数が行によって異なるcsvがあります。 これをデータベース上のテーブルに取り込みたいです。 ``` 1,3,aaa,bbb,ccc 2,2,ddd,eee ``` できれば、事前にcsv側を加工することなく取り込みたいのですが、難しいでしょうか。 ### 試したこと 不足分はNULLになってくれることを期待して、 カラム数多めのテーブルを用意し、copy実行しましたがそうはならないようでした。 またそのようなオプションを見つけることができませんでした。 ``` CREATE TABLE test3 (id int, length int, col1 text, col2 text, col3 text); COPY test3 FROM '/data.csv' WITH CSV; ERROR: 列"col3"のデータがありません CONTEXT: test3のCOPY。行番号 2: "2,2,ddd,eee" ``` ### 補足情報(FW/ツールのバージョンなど) PostgreSQL 9.5.12
回答: CSVとはせず、textで1行1項目として取り込んだ後に、加工するのはどうでしょうか。 一旦仮テーブルに取り込んで置いて、その後配列として分解して本来のテーブルに挿入。 ``` CREATE TABLE test3 (id int, length int, col1 text, col2 text, col3 text); CREATE temp TABLE test (item text) on commit drop; COPY test FROM '/data.csv' WITH text; insert into test3 select string_to_array(item ,','))[1]::int -- id , string_to_array(item ,','))[2]::int -- length , string_to_array(item ,','))[3] -- col1 , string_to_array(item ,','))[4] -- col2 , string_to_array(item ,','))[5] -- col3 from test --※添え字に該当するものが無い場合はNullになる ```