テキストデータをpostgreSQLのデータベースに一括インポートする方法(perl)

このQ&Aのポイント
  • テキストデータをpostgreSQLのデータベースに一括インポートする方法をご教授ください
  • CGI(perl)を使用してテキストデータをpostgreSQLに一括インポートする方法を知りたいです
  • テキストデータをpostgreSQLデータベースに一括でインポートする方法についてアドバイスをお願いします
回答を見る
  • ベストアンサー

テキストデータをpostgreSQLのデータベースに一括インポートする方法(perl)

今、テキストデータをpostgreSQLのデータベースに一括インポートする CGI(perl)にて作成中なのですが、息詰まってしまい、わかる方が いましたら、ご伝授いただければと思い質問させていただきました。 ■CGI(test-inport.cgi)    ~ 省略 ~ $cmd = "●●●"; system($cmd); $cmd = "psql -h ホスト名 -c 'copy テーブル名 from 'テキストファイル名'"; system($cmd); ※ここのホスト名は何を書いたらいいのでしょうか? 良かったら、教えて下さい。 上記ので、●●●に、telnet で使用する \i テーブル名 などを入れて、DBを作成し、そこにテキストデータを流したい と思っています。 しかし、 $cmd = "\i テーブル名"; system($cmd); が動きません。 どのように、書けばいいのでしょうか? 良かったら、教えて下さい。 また、アルゴリズム自体がおかしい場合は、 違う手法も教えていただければと思います。

  • Perl
  • 回答数5
  • ありがとう数1

質問者が選んだベストアンサー

  • ベストアンサー
  • Ethersky
  • ベストアンサー率71% (168/235)
回答No.5

connectしてからdisconnectするまでの間はいくつでもSQL文を実行してもよいのでループを使うのはいっこうに構いません。 要はSQL文の文法(構文)さえあっていればOKです。 ところで、ファイルハンドルを元に一行ずつ読み出すのに使うのは、 while<FILE>{ ではなくて while(<FILE>){ となります。

sara555
質問者

お礼

DBIという方法があることを 初めて知ったにも関わらず、丁寧に回答して いただいて、本当にありがとうございます。 教えていただいた方法で作成してみようと 思います。 有難うございました。

その他の回答 (4)

  • Ethersky
  • ベストアンサー率71% (168/235)
回答No.4

訂正 $db->disconnect; #切断 は正しくは $dbi->disconnect; #切断 です。 「i」が抜けてました。

  • Ethersky
  • ベストアンサー率71% (168/235)
回答No.3

$dbi = DBI->connect("dbi:Pg:dbname=データベース名;host=SQLサーバーのホスト名", $user, $password); $sql = "INSERT INTO table(foo,bar,baz) VALUES (?,?,?)"; $sth = $dbi->prepare($sql); #文の実行準備 $sth->execute; #実行 $sth->finish; #終了 $db->disconnect; #切断 ↑をdoを使うと↓のようにできます。 $dbi = DBI->connect("dbi:Pg:dbname=データベース名;host=SQLサーバーのホスト名", $user, $password); $sql = "INSERT INTO table(foo,bar,baz) VALUES (?,?,?)"; $dbi->do($sql); #文の実行準備・実行・終了 $db->disconnect; #切断

sara555
質問者

補足

とてもわかりやすい回答有難うございます。 テキストデータを繰り返して、 INSERTする場合は、 $dbi = DBI->connect("dbi:Pg:dbname=データベース名;host=SQLサーバーのホスト名", $user, $password); while<FILE>{ $sql = "INSERT INTO table(foo,bar,baz) VALUES (?,?,?)"; $dbi->do($sql); #文の実行準備・実行・終了 } $dbi->disconnect; #切断 とすれば良いのでしょうか? また、foo,bar,bazが決まっていない場合、 $dbi = DBI->connect("dbi:Pg:dbname=データベース名;host=SQLサーバーのホスト名", $user, $password); $tmp = "foo,bar,baz"; $tmp2 = "?,?,?"; while<FILE>{ $sql = "INSERT INTO table($tmp) VALUES ($tmp2)"; $dbi->do($sql); #文の実行準備・実行・終了 } $dbi->disconnect; #切断 とすれば、それぞれ違うテーブルに対して、 データをinsertした場合、使えますでしょうか? 良かったら教えてください。

  • Ethersky
  • ベストアンサー率71% (168/235)
回答No.2

> while(<CSV>) { > chop; > my ($foo,$bar,$baz) = split /,/; > $sth->execute($foo,$bar,$baz); > } executeのみ連続でしようするということはできません。 prepareとexecuteは対です。 なお、INSERTのようにSELECTで内容を取ってくるような命令でなければ、doを使うこともできます。 doを使うとprepareとexecuteとfinishが順番にすぐ行われたことになります。

sara555
質問者

補足

すみません。doを使うとは、どのように 使えばいいのでしょうか? 良かったら教えてください。

  • Ethersky
  • ベストアンサー率71% (168/235)
回答No.1

というか、DBI等のモジュールは使わないんですか? system関数で呼ぶというのはスマートな方法とはいえないですが・・・。 (DBIとはデータベースにアクセスするためのPerl言語によるAPIのことです。) ちなみにPostgreSQLへの接続の場合はDBD::Pgと併用することになります。 少なくともsystem関数でいちいち呼ぶよりは格段に扱いやすくなります。 (自分の場合はMySQLサーバーとの接続にDBI/DBDを使っています) 例 use DBI; $dbi = DBI->connect("dbi:Pg:dbname=データベース名;host=SQLサーバーのホスト名", $user, $password ); #PostgreSQLサーバーへ接続 $sql = "select * from TABLE"; #文の用意 $result = $dbi->prepare($sql); #文の実行準備 $result->execute; #実行 while(@rows = $result->fetchrow_array ) { #結果取得ループ 結果(select結果)を取得して煮るなり焼くなりの処理 } $dbi->disconnect; #PostgreSQLサーバーから切断

sara555
質問者

補足

回答有難うございます。 DBI等のモジュールというのを初めて知りましたので、 教えていただいた方法で、行ってみようと 思うのですが、したいことは、一括登録になるので、 insert処理をしたいと思っています。 この場合、教えていただいた方法を参考に作成して みたのですが、このような感じで動くものでしょうか? 教えてください。 <案> use DBI; $dbi = DBI->connect("dbi:Pg:dbname=データベース名;host=SQLサーバーのホスト名", $user, $password ); #PostgreSQLサーバーへ接続 $sth = $dbh->prepare( "INSERT INTO table(foo,bar,baz) VALUES (?,?,?)" ); while(<CSV>) { chop; my ($foo,$bar,$baz) = split /,/; $sth->execute($foo,$bar,$baz); } $dbi->disconnect; #PostgreSQLサーバーから切断

関連するQ&A

  • PostgreSQL テキストファイルのインポートができません

    初めて質問させていただきます。どうかよろしくお願いいたします。 PostgreSQL8.4を勉強始めたばかりです。 エクセルの社員一覧シートをタブ形式でD:\TEST\TEST.txtに作成いたしました。 このデータを社員テーブルにインポートしたいのですが 氏名の項目で名字と名前の間に半角の空白があり インポートできません。 ダブルコーテーションで氏名を囲むとできるのですが テーブルの項目にダブルコーテーションが入ってしまいます。 テキストファイル ------------------------------ 番号 氏名 生年月日 1 山田 太郎 19610101 2 山田 花子 19610101 社員テーブル ------------------------------- 項目名 データ型 番号 INT 氏名 VARCHAR(100) 生年月日 INT PostgreSQLではPSQLを使用しております。 インポートでは、COPYコマンドを使用しております。 COPY 社員テーブル FROM 'D:/TEST/TEST.txt'; ご教授の程、よろしくお願いいたします。

  • テキストファイルのデータをPostgreSQLに書き込む方法を教えてください

    テキストファイルから読み込んだデータをテーブルに書き込むCプログラムを作りたいのですが PostgreSQL 8.3.1を学び始まったばかりです。 テキストファイル(ユーザ、姓、名)と言う項目を作り、 データを<user>テーブルに書き込むプログラムを作りたいのですが、 「PostgreSQL 8.3.1文書 第 30章libpq - C ライブラリ」を読んでも、 どこからやればいいか、まったくわかりません。 お分かりの方、是非教えてください

  • Linux上のpostgreSQLデータをWindowsでみたい

    サーバA(OS:Linux Fedora Core 4、データベース:PostgreSQL 8.0 で運用しているシステムがあり、毎日そのデータを下記のdumpコマンドで PostgreSQLの全データをバックアップしています pg_dumpall > postgres.out  サーバAを触るのは怖いので、別のマシンB(Windows-Xp)に postgresql-8.2.6をインストールしました。 このバージョンは、postgresqlとともに、pgAdmin3というGUIの管理 ツールもついていると聞きここに、サーバAからバックアップされている postgres.outをrestoreして pgAdmin3でデータベース・テーブル等をみようとしています (postgres.out)を使ってのリストアの仕方は (1)(postgres.out)をpostgresqlの/binディレクトリの中に入れる (2)psqlのメニューから次のコマンドを打つ psql -d manmg -f postgres.out   (3)pgAdmin3を立ち上げるとサーバAのDBは追加されているようなのですが  テーブルは(0)となって見えません マシンBの方のPostgreSQLについてはインストールしたままでサーバA のpostgresqlの設定等は何もしていません 何か設定する所はあるのでしょうか 上記手順でlinuxから吐出されたバックアップデータをWindowマシンに リストアする方法は間違っていないのでしょうか よろしくお願いします。

  • telnet接続でPostgreSQLにエクセルデータの流し込み

    こんにちわ。 telnet接続しかできないPostgreSQLに手元にあるエクセルデータを流し込みたいのですが何かすっと対応できる方法は無いでしょうか? 並び方などはデータベースレイアウトに合わせております。 テーブル作成のようなスクリプトですっと流し込めないですか・・・ お手数をお掛けしますが何卒宜しくお願いいたします。

  • テキストデータのインポートの仕方

    初心者です。  汎用ホストコンピュータのデータベースのデータをMySQLにインポートをしたいと考えています。 テキストデータ(項目の区切りがない)で出力し、MySQLでテーブル定義し、インポートしてはと思っています。 1、ホスト側データのレイアウト ・顧客コード(英数字6桁)---> 123456 ・商品名(日本語5文字(10バイト) ---> 商品AAA ・数量(符号付、5バイト)---> +15 ・単価(符号なし、整数部6バイト、小数部 3バイト)---> 125.55 2、テキストデータ 12345商品AAA00015+00012555 3、MySQLのテーブル  CREATE TABLE テーブル名   ( kokyakucode varchr(6), shouhinmei ??????,   suryou    ??????,   tanka ?????? ) character set charset_name; ではと考えているのですが、????部分がわかりません。 よろしくお願いします。

    • ベストアンサー
    • MySQL
  • PostgreSQLのデータインポートについて

    初めて質問させていただきます。どうかお教えください。 今2つの別々の共用レンタルサーバーに、 それぞれPostgreSQLが組み込まれており、 それぞれデータ以外は、同じ状態になっています。 そこで、片方のサーバーからもう一方のサーバーへデータを移して、 同じデータの状態にしたいのです。 今までは、サーバー上にあるphpPgAdminというツールから、 テーブルのデータをエクスポートし、その後もう一つのサーバーの phpPgAdminにてインポートしていたのですが、 データの量が多くなったために、上記でエクスポートしたデータを テキストエディタで20分割し、少しづつインポートしなければならなくなりました。(データ量が多いとインポート時にphpPgAdminでエラーが発生するようです) 共用レンタルサーバーで利用できる 多量のデータをインポートできるツールなどはございませんでしょうか hiroko

  • SQLServerのデータをPostgreSQLに移行

    SQLServer上にあるデータをPostgreSQLに移行するのによい方法はありますか?データの移行のみでテーブル構造は既にPostgreSQL上で作成(SQLServerのテーブル構造とほぼ同じ)しているので移行しません。 現在CSVで入出力することを考えていますが、これよりもっと簡単にできる方法や、ソフトがあれば教えてください。

  • データ型textのcsvインポート

    環境 Apache2 PostgreSQL8 PHP5 EUC-JP PostgreSQLのデータ型textにて入力したデータをcsvダウンロードし、 再度csvをアップロードし取り込むプログラムを作成しております。 データ型textなので改行コードや長文のデータがあります。 csvファイルにてダウンロードする際、 \nを↑、\rをブランクに変換してcsvファイルを作成し、 csvファイルをアップロードする際は、 mb_convert_encodingにてcsvファイルのsjisをeuc-jpに変換をしております。 ほとんどのデータが問題なくアップロードできるのですが、 syntax error at or near "," というエラーが出る場合があります。 これはどのような場合に出るのでしょうか? 抽象的な質問かもしれませんが、よろしくお願いします。

    • ベストアンサー
    • PHP
  • ファイルアップロードによるPostgreSQLのデータ更新について

    OSはRedhat7.2、webサーバとしてはapache1.3.26を使用しています。 現在PHP4とPostgreSQLを使用してのwebアプリを構築中ですが、データベースへのレコード追加のことで質問があります。 テキストファイルをアップロードしデータベースに流し込むという処理をPHPから行いたいのです。 PostgreSQLに用意されているCOPYコマンドを使おうと思っていたのですがどうやらこれはPHPからは使えないらしいのです。このコマンドはPostgreSQLのスーパーユーザのみ実効可能とのことですが、DB接続時のユーザをスーパーユーザにしてもだめでした。 現在は、 echo \\\copy テーブル名 from '/tmp/$uploadfile_name' | /usr/local/pgsql/bin/psql データベース名 という文をシステム関数を使用して流すことにより処理していますが、これだとwebサーバとデータベースサーバが同じマシンじゃないとだめです。 データベースサーバとwebサーバを別のマシンにして同じような処理をするには、テキストファイルの中身を1行ずつ変数に格納して、1行ずつinsert文を発行していくしかないのでしょうか?また、この方法だと処理時間はかなりかかるのでしょうか?ちなみにテキストデータの中身は大体200行前後で一番多いときで1000行ほどです。フィールド数は70ほどです。どなたかよい方法があれば教えてください。 よろしくお願いします。

    • ベストアンサー
    • PHP
  • PostgreSQLのデータ

    PHPにてデータの入っていないテーブルに対して”pg_result”の処理をすると ”Warning: 0 is not a PostgresSQL result index”という 警告文が出てしまいます。 これを何とか回避したいのです。 また、最悪警告文のみ(Error文ではなく)表示させないようにできればいいのですが方法が分かりません。 お分かりになられる方おりましたら、よろしくご教授ください。 環境: RedhatLinux6.2J apache-1.3.12-0jp1 php-3.0.15_i18n_ja-0vl2 postgresql-7.0.2-2.i386

専門家に質問してみよう