2012-05-08 54 views
0

我想从SQL服务器拉1周数据,然后试图将数据写入具有不同名称的文件。 以下代码不起作用,我无法找到一种方法来创建具有变量的文件处理程序。Perl打印输出文件的名称与数量变量

另一个问题是,如果sql数据的大小很大(每天1-2 GB,整个表超过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

仅供参考,以''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

另一种解决方法是按天排序,然后在一行的日期与前一行的日期不同时重新打开文件句柄。 – ikegami

+0

啊,是的。我承认我甚至没有想过要避免整个事情。我想这可能是一种表现方面,没有'order by'这样的做法。 – Mat

+0

不应该有任何实际的性能差异。阅读起来可能会更简单一些,而且可扩展性更强。 (进程的可用文件句柄数量有限,虽然超过7个,但有可能达到最大值)或者在这里都可以。 – ikegami