perl - медленный анализ и отправка в базу данных - PullRequest
0 голосов
/ 18 января 2019

У меня есть этот код в Perl, и я хочу отправить в базу данных.

мой код:

my $dir = '/mnt/Logs/';
foreach my $fp (glob("$dir/SESSIONS*")) {
  printf "%s\n", $fp;
  open my $fh, "<", $fp or die "can't read open '$fp': $OS_ERROR"
while ($fh) {

    @line = split(' ',$_);      
    print "$line[0] $line[1] $line[2] $line[3] $line[4] $line[5]\n";
}

журналы:

           SID OSUSER                    TERMINAL        PROGRAM                    
    ---------- ------------------------- --------------- -------------------------  
             1 titi                    toto     tata          
             2 gigi                    gogo     gaga          
             4 fifi                    fofo     fafa 
3 rows selected.

мой вопрос, как это сделать:

SID OSUSER                  TERMINAL PROGRAM  rows selected         
  1 titi                    toto     tata     3    
  2 gigi                    gogo     gaga     3   
  4 fifi                    fofo     fafa     3

1 Ответ

0 голосов
/ 18 января 2019

Вы не знаете количество строк, пока не обработаете их все. Итак, сохраните вывод в буфере и распечатайте его в конце обработки файла:

    #!/usr/bin/perl
    use warnings;
    use strict;
    use feature qw{ say };

    open my $fh, '<', 'log' or die $!;

    my @buffer;
    while (<$fh>) {
        next if $. < 3;
        if (/^([0-9]+) rows selected\.$/) {
            die "Wrong number of rows reported: $1, seen ", scalar @buffer
                if $1 != @buffer;
        } else {
            push @buffer, [ split ' ' ];
        }
    }
    for (@buffer) {
        say join "\t", @$_, scalar @buffer;
    }

или обработайте файл дважды. В первом запуске просто посчитайте строки, во втором напечатайте их одну за другой, добавив счет:

open my $fh, '<', 'log' or die $!;

1 while <$fh>;
my $size = $. - 3;
seek $fh, $. = 0, 0;
while (<$fh>) {
    next if $. < 3;
    if (/^([0-9]+) rows selected\.$/) {
        die "Wrong number of rows reported: $1, seen ", $size
            if $1 != $size;
    } else {
        say join "\t", split(' '), $size;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...