質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

Q&A

解決済

2回答

20563閲覧

PostgreSQLのCOPYコマンドについて

---stax---

総合スコア148

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

0グッド

1クリップ

投稿2018/06/25 14:37

csvのデータをpostgresのデータベースに格納したいと考えています。
以下のcsvファイルから名前と年齢を取得したいです
イメージ説明

テーブルはname列とage列のみ作成してあります
イメージ説明

そこでCOPYコマンドというものを見つけたので使ってみようと思い、以下のコマンドを
psql.exeを起動し入力してみました。

sql

1\copy TEST.excel_db_import(name,age) FROM 'C:\Users\Desktop\dummy.csv' WITH CSV;

ですがエラーとして以下の内容が出力されます
列はname列とage列のみデータベースに入力するつもりでコマンドで指定したのですが、テーブルにはcsvに対応する全部の列が必要で個別に列の指定はできないのでしょうか?
初歩的な質問ですがアドバイス宜しくお願い致します

ERROR: extra data after last expected column CONTEXT: COPY excel_db_import, line 1: "名前,ふりがな,アドレス,性別,年齢,誕生日,婚姻,都道府県,携帯,キャリア,カ..."

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

CSVからの部分インポート(?)はできないので、
テーブルのカラム名と完全に合わせたCSVが必要になります。

せっかくなので、CSVでなく、
Excel上でINSERT INTO文を生成してみたらいいと思います。
VBAでさらっと書いてもいいし、
列の挿入などしてなんとなくINSERT INTO文っぽくしてCSV出力したあと、
ファイル名を.csv→.sqlとか変えて、
不要なtabコードを削除して連結してしまう、など方法はいくらでも。

投稿2018/06/26 00:11

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sazi

2018/06/26 00:27

テーブル項目数>=CSV項目数である必要はありますが、並びなどは指定できますから、 「テーブルのカラム名と完全に合わせたCSVが必要」ではありません。
退会済みユーザー

退会済みユーザー

2018/06/26 00:33

テーブル名のあとのカラム名の列挙がCSVとあっている必要がある、という意味で。
sazi

2018/06/26 01:03

失礼しました。
guest

0

ベストアンサー

csvファイルの項目と、インポートしようとする項目の数はあっている必要があります。

ロードに不要な列には任意の列名と”FILLER”、データ型を設定します。
以下を参考にして下さい。
COPYコマンドでCSVの特定の列をロード対象外とする方法
※いつの間にかできるようになったのかと思いましたが、何やらpostgresでは無いようでした。

対応としては、以下が考えられます。
・CSVの項目を削除する
・テーブルにダミーの項目を追加しておき、インポート後にalter tableでカラムを削除する。
・同じレイアウトのテーブルに一旦インポートして、そこからinsertする
※postgresはcreate table などのDDL文もトランザクションに含まれるので、
失敗による再処理でのテーブルやカラムの状態を気にかける必要はありません。

投稿2018/06/25 14:46

編集2018/06/25 15:56
sazi

総合スコア25138

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

---stax---

2018/06/25 15:14

回答ありがとうございます テストとしてcsvファイルの列名を少なくし、名前、性別、年齢だけにして試してみました \copy TEST.excel_db_import(name,gender filler text,age) FROM 'C:\Users\Tomo\Desktop\dummy.csv' WITH CSV; 教えていただいたリンクを見ながらgender filler textの部分を追加した上記コマンドを入力したのですが syntax error at or near "filler" このようなエラーが出ます 任意の列名 filler データ型、という形式で入力したのですがfiller 付近でどこが間違っているのか分かりません... 記述の仕方が誤っているでしょうか?
sazi

2018/06/25 15:17

ごめんなさい。誤情報で回答してしまい、訂正しました。
---stax---

2018/06/25 15:18

すいません 追記ありがとうございます 「同じレイアウトのテーブルに一旦インポートして、そこからinsertするか」 列の数や型を同じテーブルを用意するということでしょうか? そこからinsertするか、の部分はどういう操作になるのでしょうか COPYでインポートとはまた意味が違うのでしょうか?
sazi

2018/06/25 15:25

基本的にCSVの項目とインポートしようとするテーブルの項目の数は合っている必要があります。 テーブル側で対処する場合、不要な項目はtext型にしておくのが、エラーなどを気にしなくて済みます。 データのチェックを行うような場合は一旦、全てtext型のテーブルにインポートしてチェックし、必要なものだけ、目的のテーブルにinsertする方法が良いと思います。 チェックなどが不要でしたら、ダミー項目をインポート後に削除する方法が手間が少ないと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問