Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
63
Help us understand the problem. What are the problem?

More than 1 year has passed since last update.

@sf213471118

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

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

となる。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
63
Help us understand the problem. What are the problem?