私はテキストファイルをよく扱い、「SQL方式」で相互に比較します。
DBD::CSV
テキストテーブルでSQL構文の力を使用できるので、最初は明らかに良い選択です。しかし、私は巨大なテキストファイルを扱っているので、DBD::CSV
パフォーマンスの面では役に立たない。
DBI::sqlite
それで、私はcsvファイルをsqlite DBに変換し、それから私が遊ぶことができるオブジェクトを返すモジュールを書き始めていました。重要なのは、テキストファイルをsqliteテーブルに変換することもあまり効率的ではない可能性があるということです。perlからsqliteコマンドラインを実行してCSVファイルをすばやくロードすることができないためです(.loadを使用)。したがってInsert into
、テキストテーブルに基づいて巨大な文字列を作成し、それを実行する必要があります(Insertを1行ずつ実行すると、パフォーマンスの点で非常に非効率的であるため、1つの大きな挿入を実行することをお勧めします)。私はそれを避けたいと思っています。perlを使用してcsvをsqliteにロードするためのワンライナーを探しています。
また、次の関数を使用して、SQLクエリを適切に実行および出力しました。
sub sql_command {
my ($self,$str) = @_;
my $s = $self->{_db}->prepare($str) or die $!;
$s->execute() or die $!;
my $table;
push @$table, [ map { defined $_ ? $_ : "undef" } @{$s->{'NAME'}}];
while(my $row = $s->fetch) {
push @$table, [ map{ defined $_ ? $_ : "undef" }@$row ];
}
box_format($table);
return box_format($table);;
}
sub box_format {
my $table = shift;
my $n_cols = scalar @{$table->[0]};
my $tb = Text::Table->new(\'| ', '', (\' | ','')x($n_cols-1), \' |+');
$tb->load(@$table);
my $rule = $tb->rule(qw/- +/);
my @rows = $tb->body();
return $rule, shift @rows, $rule, @rows, $rule
if @rows;
}
サブのsql_command
実行には約1分かかります(6.5 MBファイルの場合)。これは、私の意見では、予想よりもはるかに長いです。誰かがより効率的な解決策を持っていますか?
ありがとう!