2012-05-08 2 views
0

Я пытаюсь вытащить данные за 1 неделю с сервера sql, а затем попытаюсь записать данные в файлы с отдельными именами. Следующие коды не работают, и я не могу найти способ создания обработчиков файлов с переменной.Perl печатает выходные имена файлов с числовой переменной

Другой вопрос в том, что если размер данных sql огромен (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

Другим решением является ORDER BY day, а затем повторно открыть дескриптор файла, когда день для одной строки отличается от дня для предыдущей строки. – ikegami

+0

Ах, да. Признаюсь, я даже не думал о попытке избежать всего этого. Я предполагаю, что _might_ будет аспектом производительности для этого без 'order by'. – Mat

+0

Не должно быть реальной разницы в производительности. Это может быть немного проще читать, и это немного более масштабируемо. (Процессы имеют ограниченное количество файлов в их распоряжении. В то время как это больше, чем 7, можно достигнуть максимума.) Либо все будет хорошо. – ikegami

Смежные вопросы