DBIとDBD::CSVでドイツ語スタイルのCSVファイルを使用しようとしています。次に、Text::CSVを使用してファイルを解析します。SQLを使用してそのファイルのデータをクエリしたいと思います。
最初にファイルを見てみましょう。セミコロン()で区切られ;
、その中の数字は次のようになります。5,23
これは英語と同等5.23
です。
これが私がこれまでに得たものです:
use strict; use warnings;
use DBI;
# create the database handle
my $dbh = DBI->connect(
'dbi:CSV:',
undef, undef,
{
f_dir => '.',
f_schema => undef,
f_ext => '.csv',
f_encoding => 'latin-1',
csv_eol => "\n",
csv_sep_char => ';',
csv_tables => {
foo => {
file => 'foo.csv',
#skip_first_row => 0,
col_names => [ map { "col$_" } (1..3) ], # see annotation below
},
},
},
) or croak $DBI::errstr;
my $sth = $dbh->prepare(
'SELECT col3 FROM foo WHERE col3 > 80.50 ORDER BY col3 ASC'
);
$sth->execute;
while (my $res = $sth->fetchrow_hashref) {
say $res->{col3};
}
さて、これはかなりいいですね。問題は、SQL(DBIおよびDBD::CSVのどこかにあるSQL::Statementを意味します)が、のデータを考慮しないことcol3
です。これは、中央にコンマが含まれる浮動小数点値です。浮く。代わりに、コンマを理解しないため、列を整数として扱います。
データの例を次に示します。
foo;foo;81,90
bar;bar;80,50
baz;baz;80,70
したがって、このデータを含む上記のコードは、1行の出力になります81,90
。もちろん、それは間違っています。比較のint()
一部を使用しましたが、これは正しいですが、私が望むものではありません。col3
質問:コンマを含む数値をfloatとして扱うように指示するにはどうすればよいですか?
私が考えたこと:
- Text::CSVにこれを行うための組み込みの方法は見つかりませんでした。Text :: CSVのどこにこれをフックできるか、またはText::CSVにそのようなものを入れるメカニズムがあるかどうかはわかりません。
- DBD::CSVが可能であればText::CSV_XSを使用したいという問題が発生するかどうかはわかりません。
- データが読み取られ、すでにどこかに保存された後で、後でそれを実行できるかもしれませんが、適切なアクセスポイントがどこにあるかはまだわかりません。
- SQL::Statementに保存されていることを理解しています。まだどこかわかりません。これはどういうわけか便利かもしれません。
ソースCSVファイルをコンマではなくドットに変更することはできません。
私はあらゆる種類の提案を受け入れています。SQLを介したCSV全体への他のアプローチも歓迎します。どうもありがとう。