🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
PostgreSQL

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

Q&A

解決済

1回答

12315閲覧

PostgreSQLの\COPYコマンドでTSVファイルのデータを取り込めない

退会済みユーザー

退会済みユーザー

総合スコア0

PostgreSQL

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

0グッド

0クリップ

投稿2018/11/30 05:12

編集2018/12/06 00:28

解決したい問題
\COPYコマンドでTSVファイルのデータをインポートする方法をご教授いただきたいです。

一応の解決方法
TSVファイルをあきらめ、CSVファイルに変更しました。
下記で一応動きました。。

sql

1\encoding utf8 2 3drop table access_log; 4\i src/access_log.ct 5\copy access_log from 'src/access_log.bz2.csv' with csv header null '' delimiter ',' quote e'"';

tsv

1"www.hoge.com"~"-"~"-"~"04/Sep/2018:20:38:28 +0900"~"GET"~"/index.php?q=abc&s=def%3Aghi""~"200"~"144155"~"-"~"-" 2"www.fuga.net"~"-"~"-"~"06/Sep/2018:01:37:44 +0900"~"GET"~"/index.php?id=123&q=abc def"~"301"~"294"~"a " a"~"Opera/9.27" 3

バッチファイル実行後のメッセージ

cmd

1C:\Users\user\Desktop\sql>call .\parameters-windows.bat 2 3C:\Users\user\Desktop\sql>set PGHOST=localhost 4 5C:\Users\user\Desktop\sql>set PGPORT=5432 6 7C:\Users\user\Desktop\sql>set PGDATABASE=postgres 8 9C:\Users\user\Desktop\sql>set PGUSER=postgres 10 11C:\Users\user\Desktop\sql>set PSQL="C:\Program Files\PostgreSQL\9.4\bin\psql" 12 13C:\Users\user\Desktop\sql>"C:\Program Files\PostgreSQL\9.4\bin\psql" -f load.sql 14DROP TABLE 15CREATE TABLE 16COPY 0 17 18C:\Users\user\Desktop\sql>pause 19続行するには何かキーを押してください . . . 20

バッチファイル

bat

1 2call .\parameters-windows.bat 3%PSQL% -f load.sql 4pause 5 6rem parameters-windows.bat 7set PGHOST=localhost 8set PGPORT=5432 9set PGDATABASE=postgres 10set PGUSER=postgres 11set PSQL="C:\Program Files\PostgreSQL\9.4\bin\psql" 12

sql

1\encoding utf8 2 3drop table access_log; 4\i src/access_log.ct 5\copy access_log from 'src/access_log.tsv' WITH CSV DELIMITER E'~' header null '' QUOTE '"'; 6

ct

1create table access_log 2( a text 3, b text 4, c text 5, d text 6, e text 7, f text 8, g text 9, h text 10, i text 11, j text 12);

環境

  • Windows10
  • PostgresSQL 9.4

追加で試したこと
パターン1(pattern_1.tsv)

\copy access_log from 'src/pattern_1.tsv' ( format text, delimiter ' ', quote '"' ); 2018-12-03 08:02:24 JST ERROR: COPYの引用符はCSVモードでのみ使用できます 2018-12-03 08:02:24 JST ステートメント: COPY access_log FROM STDIN ( format text, delimiter ' ', quote '"' );

パターン2(pattern_1.tsv)

2018-12-03 08:17:46 JST ERROR: CSV引用符が閉じていません 2018-12-03 08:17:46 JST コンテキスト: access_logのCOPY。行番号 1: "www.hoge.com - - 04/Sep/2018:20:38:28 +0900 GET /index.php?q=abc&s=def%3Aghi" 200 144155 - - www.fug..." 2018-12-03 08:17:46 JST ステートメント: COPY access_log FROM STDIN ( format csv, delimiter ' ', quote '"' );

パターン3(pattern_2.tsv)

2018-12-03 08:23:18 JST ERROR: 列"h"のデータがありません 2018-12-03 08:23:18 JST コンテキスト: access_logのCOPY。行番号 1: ""www.hoge.com" "-" "-" "04/Sep/2018:20:38:28 +0900" "GET" "/index.php?q=abc&s=def%3Aghi"" "200" "144..." 2018-12-03 08:23:18 JST ステートメント: COPY access_log FROM STDIN ( format csv, delimiter ' ', quote '"' );

pattern_1.tsv

tsv

1www.hoge.com - - 04/Sep/2018:20:38:28 +0900 GET /index.php?q=abc&s=def%3Aghi" 200 144155 - - 2www.fuga.net - - 06/Sep/2018:01:37:44 +0900 GET /index.php?id=123&q=abc def 301 294 a a Opera/9.27

pattern_2.tsv

tsv

1"www.hoge.com" "-" "-" "04/Sep/2018:20:38:28 +0900" "GET" "/index.php?q=abc&s=def%3Aghi"" "200" "144155" "-" "-" 2"www.fuga.net" "-" "-" "06/Sep/2018:01:37:44 +0900" "GET" "/index.php?id=123&q=abc def" "301" "294" "a " a" "Opera/9.27"

参考サイト
PostgreSQLのcopyではまった

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

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

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

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

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

CHERRY

2018/11/30 06:15

回答を記載した後ですが、実行するとどのようなメッセージが出ているのでしょうか?
退会済みユーザー

退会済みユーザー

2018/11/30 06:34

CHERRYさん、ご回答ありがとうございます。実行後のメッセージを追記しました。
退会済みユーザー

退会済みユーザー

2018/11/30 06:56

https://teratail.com/questions/161180 とどう違うの。回答が得られないからといって何度も同じような質問を投稿していいわけじゃないよ。
退会済みユーザー

退会済みユーザー

2018/11/30 07:08 編集

m6uさん、ご回答をいただいたのに失礼なことをして大変申し訳ございません。今回はエラーログも無いですし別物との認識をしておりました。今後から気を付けるようにいたします。
guest

回答1

0

ベストアンサー

set PSQL="C:\Program Files\PostgreSQL\9.4\bin\psql"

\copy access_log from 'src/access_log.tsv' WITH CSV DELIMITER E'~' header null '' QUOTE '"';

PostgreSQL 9.4 であれば、delimiter 等のオプション部分は、( ) で必要があったのではないでしょうか。

例:

\copy table_name from '/path/to/data.tsv' ( format text, delimiter ' ', quote '"' );

delimiter ' ' のシングルクォートに囲まれている「スペース」にみえる部分は、タブコードです。

また、format text を指定すると デフォルトは、タブ区切りになったと思います。

参考:

投稿2018/11/30 06:12

CHERRY

総合スコア25216

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

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

退会済みユーザー

退会済みユーザー

2018/11/30 06:38

CHERRYさん、詳細なご回答ありがとうございます。試してみます。
退会済みユーザー

退会済みユーザー

2018/12/03 00:08

パターン1、パターン2、パターン3と試してみたのですが、エラーが発生していましました。
CHERRY

2018/12/03 06:45 編集

すいません。ドキュメントのこの部分を見落としていました。 > このオプションはCSV形式を使用する場合にのみ許されます。 text だと quote が使えないので、エラーになっていますね。
退会済みユーザー

退会済みユーザー

2018/12/03 07:32

CHERRYさん、ご確認ありがとうございます。 format csvに変更してもエラーが発生してしまいます。他の方法を考えた方がいいのでしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問