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

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

ただいまの
回答率

89.06%

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

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 3,758

data-analysis

score 19

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

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

\encoding utf8

drop table access_log;
\i src/access_log.ct
\copy access_log from 'src/access_log.bz2.csv' with csv header null '' delimiter ',' quote e'"';
"www.hoge.com"~"-"~"-"~"04/Sep/2018:20:38:28 +0900"~"GET"~"/index.php?q=abc&s=def%3Aghi""~"200"~"144155"~"-"~"-"
"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"

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

C:\Users\user\Desktop\sql>call .\parameters-windows.bat

C:\Users\user\Desktop\sql>set PGHOST=localhost

C:\Users\user\Desktop\sql>set PGPORT=5432

C:\Users\user\Desktop\sql>set PGDATABASE=postgres

C:\Users\user\Desktop\sql>set PGUSER=postgres

C:\Users\user\Desktop\sql>set PSQL="C:\Program Files\PostgreSQL\9.4\bin\psql"

C:\Users\user\Desktop\sql>"C:\Program Files\PostgreSQL\9.4\bin\psql" -f load.sql
DROP TABLE
CREATE TABLE
COPY 0

C:\Users\user\Desktop\sql>pause
続行するには何かキーを押してください . . .

バッチファイル

call .\parameters-windows.bat
%PSQL% -f load.sql
pause

rem parameters-windows.bat
set PGHOST=localhost
set PGPORT=5432
set PGDATABASE=postgres
set PGUSER=postgres
set PSQL="C:\Program Files\PostgreSQL\9.4\bin\psql"
\encoding utf8

drop table access_log;
\i src/access_log.ct
\copy access_log from 'src/access_log.tsv' WITH CSV DELIMITER E'~' header null '' QUOTE '"';
create table access_log
( a text
, b text
, c text
, d text
, e text
, f text
, g text
, h text
, i text
, j text
);

環境

  • 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

www.hoge.com    -    -    04/Sep/2018:20:38:28 +0900    GET    /index.php?q=abc&s=def%3Aghi"    200    144155    -    -
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

pattern_2.tsv

"www.hoge.com"    "-"    "-"    "04/Sep/2018:20:38:28 +0900"    "GET"    "/index.php?q=abc&s=def%3Aghi""    "200"    "144155"    "-"    "-"
"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ではまった

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • CHERRY

    2018/11/30 15:15

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

    キャンセル

  • data-analysis

    2018/11/30 15:34

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

    キャンセル

  • m6u

    2018/11/30 15:56

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

    キャンセル

  • data-analysis

    2018/11/30 16:08 編集

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

    キャンセル

回答 1

checkベストアンサー

+1

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 15:38

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

    キャンセル

  • 2018/12/03 09:08

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

    キャンセル

  • 2018/12/03 15:44 編集

    すいません。ドキュメントのこの部分を見落としていました。
    > このオプションはCSV形式を使用する場合にのみ許されます。

    text だと quote が使えないので、エラーになっていますね。

    キャンセル

  • 2018/12/03 16:32

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

    キャンセル

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

  • ただいまの回答率 89.06%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る