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

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

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

bash(Bourne-again-Shell)は sh(Bourne Shell)のインプリメンテーションに様々な機能が追加されたシェルです。LinuxやMac OS XではBashはデフォルトで導入されています。

CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

PostgreSQL

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

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

1606閲覧

Pythonでbz2からtsvに変換したファイルをPostgreSQLにコピーしようとするとエラーが発生

退会済みユーザー

退会済みユーザー

総合スコア0

bash

bash(Bourne-again-Shell)は sh(Bourne Shell)のインプリメンテーションに様々な機能が追加されたシェルです。LinuxやMac OS XではBashはデフォルトで導入されています。

CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

PostgreSQL

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

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2018/11/27 06:41

件名の通りです。対処方法をご教授いただけませんでしょうか?よろしくお願いいたします。

環境

  • Windows10
  • Spyder(Python 3.6)
  • PostgresSQL 9.4

エラー内容

log

1 22018-11-27 13:53:24 JST ERROR: 列"b"のデータがありません 32018-11-27 13:53:24 JST コンテキスト: access_logのCOPY。行番号 2: "hoge.ne.jp - - [01/Sep/2018:02:00:03 +0900] "GET index.php_..." 42018-11-27 13:53:24 JST ステートメント: COPY access_log FROM STDIN WITH CSV DELIMITER E'\t' header null ''; 5

バッチファイル

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 13

SQL

sql

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

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, k text 13);

Apacheのログ

conf

1"%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\""

Pythonスクリプト

python

1 2import bz2 3import re 4import codecs 5 6fr = bz2.open(r'C:\Users\user\Desktop\bz2\access_log.bz2', 'rt') 7fw = codecs.open(r'C:\Users\user\Desktop\bz2\access_log.bz2.tsv', 'w', encoding='utf-8') 8 9line = fr.readline() 10#line = line.replace(',', ' ') 11 12while line: 13 fline = re.sub(r'^(\S+) (\S+) (\S+) (\S+) [([^]]+)] "([A-Z]+) ([^ "]+)? HTTP/[0-9.]+" ([0-9]{3}) ([0-9]+|-) "([^\"]*)" "([^\"]*)"', r'\1\t\2\t\3\t\4\t\5\t\6\t\7\t\8\t\9\t\10\t\11', line) 14 check = re.search(r'/public/|/bot/|Googlebot|msnbot|bingbot|applebot|SemrushBot|AhrefsBot|MJ12bot|AdsBot|DotBot|istellabot|Twitterbot|YandexMobileBot|/bots|/bot.html|robots.txt', fline) 15 if check is None: 16 fw.write(fline) 17 line = fr.readline() 18fr.close() 19fw.close() 20 21

コピペ & 参考にさせていただいたページ

](https://stackoverflow.com/questions/18766955/how-to-write-utf-8-in-a-csv-file)

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

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

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

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

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

guest

回答1

0

ベストアンサー

CSVなのにcopyコマンドで指定しているのはtsv(タブ区切り)です。
ですのでタブでの区切りを探して、見つからないので、「bカラムが無い」というエラーです。
pythonでtsvが生成されているか確認してみて下さい。
※参考記事はCSVなのに、敢えてtsvにする必要があるのですか?

csvを指定するとデフォルトは,区切りですので、DELIMITERは不要です。

投稿2018/11/27 08:10

編集2018/11/27 08:16
sazi

総合スコア25074

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

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

退会済みユーザー

退会済みユーザー

2018/11/27 08:52

saziさん、ご回答ありがとうございます。途中で,が入っている場合があるため、tsvにしました。
sazi

2018/11/27 09:00

TSVにはなっているんですよね? 以前タブ区切りの指定がE`\t`では上手くいかなくて、テキストエディタの「タブ」をコピーしてそのまま貼り付けで、上手くいった事はあります。
sazi

2018/11/27 09:02 編集

後は、区切り記号を他の記号(例えばチルダ(~))にしてみるとか
退会済みユーザー

退会済みユーザー

2018/11/27 09:04

ありがとうございます!試してみます。
退会済みユーザー

退会済みユーザー

2018/11/28 06:31

できたかと思ったら2967100行目でエラー発生・・・もうちょっと色々やってみます。 ```log 2018-11-28 15:13:58 JST ERROR: 列"b"のデータがありません 2018-11-28 15:13:58 JST コンテキスト: access_logのCOPY。行番号 2967100: "・・・" 2018-11-28 15:13:58 JST ステートメント: COPY access_log FROM STDIN WITH CSV DELIMITER E'~' header null ''; ``` ```bash $ head -2967100 access_log.tsv | tail -1 hoge1234.fuga.piyo.com - - [04/Sep/2018:20:38:28 +0900] "GET /test.php?hoge=test'&fuga=htype%3Ah1'\" HTTP/1.1" 200 144155 "-" "-" ```
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.51%

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

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

質問する

関連した質問