LoginSignup
82
81

More than 3 years have passed since last update.

PostgreSQLでcsvファイルのインポート

Posted at

PostgreSQLでCSVデータのインポートについてささっと。

事前準備(テーブル作成まで)

まずはDBを作成

名前は適当にcustomer。作ったらDB内へ入る

terminal
sf213471118:~ sf213471118$ createdb customer
sf213471118:~ sf213471118$ psql customer
psql (11.4)
Type "help" for help.
customer=# 

以下の感じでcustomerテーブルを作っていく

[テーブル]

id name gender age
10001 田中太郎 m 31
10002 中村花子 w 44
10003 佐藤一郎 m 20
10004 内田彩 w 18
10005 高橋次郎 m 56
10006 中里悟 m 34

[詳細]

カラム 詳細
id 5桁の数字
name 桁数指定なしの文字
gender 男 --> m
女 --> w
age 桁数指定なしの数字

今回はDBをUTF-8で作成してあるので

terminal
customer=# \l
                                List of databases
   Name    |    Owner    | Encoding | Collate | Ctype |   Access privileges   
-----------+-------------+----------+---------+-------+-----------------------
 customer  | sf213471118 | UTF8     | C       | C     | 

日本語を使用する今回は1文字3バイトをしっかり考慮する必要がある。

では早速テーブル作成

terminal
customer=# CREATE TABLE customer
(id char(15) NOT NULL,
name varchar NOT NULL,
gender char(3) NOT NULL,
age INTEGER ,
PRIMARY KEY (id));
CREATE TABLE

csvファイルをテーブルに全てをインポート

csvファイルを読み込む際はpsql内の\copyコマンドを使用する。

後ろについているwith csvがcsvファイルをコピーする命令となっている。

terminal
# \copy <Table name> from <File name/pass> with csv

このwith csvがないとただのtxtになるので注意。

今回はあらかじめcustomer.csvを作成しておいたので、早速インポート。

image.png

terminal
customer=# \copy customer from 'Documents/customer.csv' with csv
COPY 6

確認して格納されていることを確認。

terminal
customer=# SELECT * FROM customer;
       id        |   name   | gender | age 
-----------------+----------+--------+-----
 10001           | 田中太郎 | m      |  31
 10002           | 中村花子 | w      |  44
 10003           | 佐藤一郎 | m      |  20
 10004           | 内田彩   | w      |  18
 10005           | 高橋次郎 | m      |  56
 10006           | 中里悟   | m      |  34
(6 rows)

今回はヘッダー無しのパターンだったが、ヘッダーありのパターンの場合はcopyコマンドのoptionが若干異なる。

例えば以下のようなcsvファイルを読み込む場合は
image.png

terminal
# \copy <Table name> from <File name/pass> with csv header

headeroptionをつけることでインポートが可能になる。

csvファイルの指定カラムのみをテーブルにインポート

指定カラムのみをインポートしたい場合にはテーブル名の後ろにカラムを指定すればOK

terminal
# \copy <Table name>(column1,column2, ... ) from <File name/pass> with csv

先ほどの例をベースにしてid,nameのみを指定して取り出すと

terminal
customer=# \copy customer(id,name) from 'Documents/customer.csv' with csv

となる。

82
81
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
82
81