1. sf213471118

    Posted

    sf213471118
Changes in title
+PostgreSQLでcsvファイルのインポート
Changes in tags
Changes in body
Source | HTML | Preview
@@ -0,0 +1,158 @@
+PostgreSQLでCSVデータのインポートについてささっと。
+
+
+##事前準備(テーブル作成まで)
+
+まずはDBを作成
+
+
+
+名前は適当に**customer**。作ったらDB内へ入る
+
+```terminal: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 <br> 女 --> w|
+|age|桁数指定なしの数字|
+
+
+
+
+
+今回はDBを**UTF-8**で作成してあるので
+
+```terminal:terminal
+customer=# \l
+ List of databases
+ Name | Owner | Encoding | Collate | Ctype | Access privileges
+-----------+-------------+----------+---------+-------+-----------------------
+ customer | sf213471118 | UTF8 | C | C |
+```
+日本語を使用する今回は**1文字3バイト**をしっかり考慮する必要がある。
+
+
+
+
+では早速テーブル作成
+
+
+
+
+
+
+```terminal: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ファイルをコピーする命令となっている。
+
+```sql:terminal
+# \copy <Table name> from <File name/pass> with csv
+```
+
+この`with csv`がないとただのtxtになるので注意。
+
+今回はあらかじめ**customer.csv**を作成しておいたので、早速インポート。
+
+
+![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/426462/38c88789-9cf2-0270-0408-b44a68f2c7cd.png)
+
+
+
+
+```sql:terminal
+customer=# \copy customer from 'Documents/customer.csv' with csv
+COPY 6
+```
+
+確認して格納されていることを確認。
+
+```sql: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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/426462/684f82e6-7890-d48c-0565-ebdebb787d32.png)
+
+```sql:terminal
+# \copy <Table name> from <File name/pass> with csv header
+```
+
+と`header`optionをつけることでインポートが可能になる。
+
+
+
+
+
+
+
+##csvファイルの指定カラムのみをテーブルにインポート
+
+
+指定カラムのみをインポートしたい場合にはテーブル名の後ろにカラムを指定すればOK
+
+
+```sql:terminal
+# \copy <Table name>(column1,column2, ... ) from <File name/pass> with csv
+```
+
+
+先ほどの例をベースにして`id`,`name`のみを指定して取り出すと
+
+
+```sql:terminal
+customer=# \copy customer(id,name) from 'Documents/customer.csv' with csv
+```
+
+となる。