【问题标题】:Perl print output file names with number variablePerl 使用数字变量打印输出文件名
【发布时间】:2012-05-08 18:25:44
【问题描述】:

我正在尝试从 sql server 中提取 1 周的数据,然后尝试将数据写入具有不同名称的文件中。 以下代码不起作用,我找不到使用变量创建文件处理程序的方法。

另外一个问题是,如果sql数据量很大(每天1-2G,整张表超过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');  
    }

【问题讨论】:

  • 仅供参考,'dayfile_$day 中的单引号将阻止变量$day 的插值。当然,除了它是无效的文件句柄。

标签: sql perl variables fetch filehandler


【解决方案1】:

您不能像尝试那样使用纯字符串作为变量。

我能想到的最简单的方法是使用散列来映射文件名和文件句柄。

下面是一个示例,说明如何做到这一点:

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;
}

【讨论】:

  • 另一种解决方案是按天排序,然后在某一行的日期与前一行的日期不同时重新打开文件句柄。
  • 啊,是的。我承认我什至没有想过要避免整件事。我想在没有order by 的情况下,可能会影响性能。
  • 不应该是任何真正的性能差异。它可能只是更易于阅读,并且更具可扩展性。 (进程可以使用的文件句柄数量有限。虽然超过 7 个,但有可能达到最大值。)任何一个在这里都可以。
猜你喜欢
  • 2023-03-22
  • 2020-02-11
  • 1970-01-01
  • 2014-06-22
  • 1970-01-01
  • 2014-07-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多