Perl use Sprite

提供: dococo wiki
2017年10月22日 (日) 06:38時点におけるimported>Webmasterによる版
(差分) ← 古い版 | 最新版 (差分) | 新しい版 → (差分)
ナビゲーションに移動 検索に移動

CSVのファイルをSQLコマンドを使って操作するためのモジュールです。
使い切っていないけど、巨大ファイルの操作ができるのか興味があったので使い方を勉強しています

インストール

標準モジュールでは無いので、CPANからインストールします。

ベースとなるデータの形式

これも、経験的に記載しています

  • 1行目の項目名ですが、2バイト文字(日本語)を使うとエラーになりました。なので1バイト文字に置き換える必要がある
  • データとなる区切り文字ですがset_delimiter ('-read' => '\s{2,}|\t')の様に指定します。ただ、カンマ区切りとかだとエラーを起こしましたので、TAB形式(TSV形式)に変換しておく方が良いです
  • データについてはSJIS形式で2バイト文字でも使用出来ましたので全体のデータ形式だけ注意が必要です
  • また、ファイル名やファイルを指定する場合でも2バイト文字が使用出来ました

プログラム例

一例ですけど、test.dbにテキスト形式で入っているデータに対して以下のSQLを発行させて、値が帰って来るというモジュールです。(SQLが大文字小文字メチャクチャですけど、これでもコマンドが通るということを言いたいのだと思います)
sElEcT * fRoM $database

wHeRe (Years  >= 10) and
         (Points >= 20) AnD
         (Championships >= 1)


	#厳密な構文チェックと警告表示
	use strict;
	use warnings;
	
	use Sprite;
	
	#実行中のファイルがおいてあるディレクトリまでの絶対パスを得る
	use FindBin;

	use Data::Dumper;

	##初期設定
	#$rdbを使ってデータベース操作を行います
	my $rdb = new Sprite;
	$rdb->set_os('Windows95');
	$rdb->set_db_dir($FindBin::Bin.'\\data\\');
	$rdb->set_delimiter ('-read'  => '\s{2,}|\t');#2回以上の「空白」繰り返しまたはタブにマッチ
	$rdb->set_delimiter ('-write' => '::');
	#初期設定ここまで

	my $database = "test.db";

print STDERR "Performing select ... \n";

	my $data = $rdb->sql (<<EOS);

    sElEcT * fRoM $database
    wHeRe (Years  >= 10) and
          (Points >= 20) AnD
          (Championships >= 1)


EOS

返り値

$dataに返り値が入るのですがイメージが全く分からずにdata dummperとかして解析しました。
2017-10-22 13-05-55.jpg
イメージはこんな感じのリファレンスのリファレンスになっていて、要素を参照しなければならないです。
今の段階では、SQLで打ち込んだ条件で値が返ってくるというレベルで考えておいてください。プログラム解説は別途行います。