2012-05-08 7 views
0

私はSQL Serverから1週間のデータを取り出し、別の名前のファイルにデータを書き込もうとしています。 以下のコードは機能せず、変数付きのファイルハンドラを作成する方法が見つかりません。Perlは数値変数を持つ出力ファイル名を返します

もう1つの質問は、SQLデータのサイズが大きい(1日当たり1-2ギガバイトで、テーブル全体が1年間以上)場合、この毎月のフェッチ方法は毎日のフェッチより速いということですか?

my $sqlGetEid = "select trunc(datetime, 'DD') truncdate, x, y from z 
     where DATETIME between TO_DATE('$dt1','YYYY-MM-DD') and TO_DATE('$dt1','YYYY-MM-DD')+7"; 

    for ($day=1; $day<=7; $day++){ 
     open('dayfile_$day', "> ./temp/Wireless_$day.csv"); 
    } 

    while (my ($tday,$x,$y) = $curSqlEid->fetchrow_array()) 
    { 
     printf {'dayfile_$tday'} ("%s,%d\n", $x,$y); 
    } 

    for ($day=1; $day<=7; $day++){ 
     close('dayfile_$day'); 
    } 
+0

FYI、 ' 'dayfile_ $ day'での単一引用符は、変数' $のday'の補間を防ぐことができます。それはもちろん、無効なファイルハンドルです。 – TLP

答えて

2

あなたがしようとしているように単純な文字列を変数として使用することはできません。

私が考えることができる最も簡単な方法は、ファイルハンドルにファイル名をマップするハッシュを使用することです。

ここであなたがそれを行うことができる方法の例です:

use strict; 
use warnings; 

my %files; 

foreach my $i (1..7) { 
    my $fh; 
    open($fh, '>', "day_$i.log") || die "Ooups: $i: $!"; 
    $files{$i} = $fh; 
} 

foreach my $i (1..7) { 
    my $fh = $files{$i}; 
    print $fh "hello $i\n"; 
} 

foreach my $i (1..7) { 
    my $fh = $files{$i}; 
    close $fh; 
} 
+0

もう1つの解決策は、1日のORDER BYに、1行の日が前の行の日と異なる場合にファイルハンドルを再度開くことです。 – ikegami

+0

ああ、はい。私はすべてを避けようと考えていないことを認めます。私はそこに、「注文する」ことなくそれをすることがパフォーマンス面であると思うでしょう。 – Mat

+0

実際のパフォーマンスの違いはありません。読むのが少しシンプルになるかもしれませんし、それはもう少し拡張性があります。 (プロセスは限られた数のファイルしか扱うことができませんが、7以上の場合は最大値に達する可能性があります)。 – ikegami

関連する問題