end0tknr's kipple - 新web写経開発

http://d.hatena.ne.jp/end0tknr/ から移転します

DBD::CSV csvファイルをRDBとして扱う

DBD::CSV を使うと、csvファイルをRDBとして扱うことができます。

「DBD::〜」という名前からも分かるとおり、使い方はDBDと同じです。
例えば、次のように接続?すると、指定したdir以下にあるcsvファイルをtableとして扱うことができます。
また、切断方法?もDBDと同様です。

#!/usr/local/bin/perl
use strict;
use utf8;
use DBI;
use Data::Dumper;

main();

sub main {
    my $dbh = DBI->connect ("dbi:CSV:",undef,undef,
			    {f_dir		=>".",
			     f_ext		=>".csv",
			     f_encoding		=>"utf8",
			     csv_eol		=>"\n",
			     csv_sep_char	=>",",
			     csv_quote_char	=>'"',
			     csv_escape_char	=>'"',
			     csv_class		=>"Text::CSV_XS",
			     RaiseError		=>1,}) or die $DBI::errstr;
    my $sql =<<EOF;
select * from soukanjo
where kamoku_group = '内緒'
EOF
    my $sth = $dbh->prepare($sql);
    print STDERR Dumper($sth);
    $sth->execute();
    while(my $row = $sth->fetchrow_hashref()){
	print STDERR Dumper($row);
    }
    $dbh->disconnect;
}

DBD::CSVで接続したdir以下にあるcsvファイルは、ファイル名がそのままテーブル名になります。

DBI->connect()時のf_encodingで、Encode::decode()と同様の効果アリ

DBI->connect()時にf_encodingを指定すると、csvの読込時にperlの内部文字コードに変換してくれるみたい。

http://search.cpan.org/perldoc?DBD::File

AutoCommit -> Always on

cpanに記載されている通りです
http://search.cpan.org/perldoc?DBD::CSV