Я хочу записать несколько файлов из одного файла без использования массива для устранения сложности - PullRequest
0 голосов
/ 27 ноября 2018

Я хочу записать несколько файлов из одного файла (каждый раз получая последние данные), не используя массив для устранения сложности.Я уже пробовал использовать массив, но когда объем данных выше, это замедлит процесс.

Пожалуйста, дайте мне подсказку, как устранить сложность программы.

Ввод: чтениетекстовый файл из каталога.

Вывод:

File1.pl - 1 2 3 4 5 6
File2.pl - 6 7 8 9 10
File3.pl -11 12 13 14 15
File4.pl -16 17 18 19 20

Я делаю это с использованием массива:

use feature 'state';
open (DATA,"<","e:/today.txt");
@array=<DATA>;
$sizeofarray=scalar @array;

print "Total no. of lines in file is :$sizeofarray";
$count=1;
while($count<=$sizeofarray)
{
    open($fh,'>',"E:/e$count.txt");
    print $fh "@array[$count-1..($count+3)]\n";
    $count+=5;
}

Ответы [ 2 ]

0 голосов
/ 27 ноября 2018

Сохранять строки в небольшом буфере, открывать файл каждую пятую строку и записывать в него буфер

use warnings;
use strict;
use feature 'say';

my $infile = shift || 'e:/today.txt';

open my $fh_in, '<', $infile or die "Can't open $infile: $!";

my ($fh_out, @buf);

while (<$fh_in>) {
    push @buf, $_; 
    if ($. % 5 == 0) {
        my $file = 'e' . (int $./5) . '.txt';
        open $fh_out, '>', $file  or do {
            warn "Can't open $file: $!";
            next;
        };
        print $fh_out $_ for @buf;
        @buf = (); 
    }
}

# Write what's left over, if any, after the last batch of five
if (@buf) {
    my $file = 'e' . ( int($./5)+1 ) . '.txt';
    open $fh_out, '>', $file or die "Can't open $file: $!";
    print $fh_out $_ for @buf;
}
0 голосов
/ 27 ноября 2018

Как я заметил из вашего кода, вы можете попробовать это

  use warnings;
  use strict;
  open (my $fh,"<","today.txt") or die "Error opening $!";

  my $count = 1;
  while(my $line = <$fh>)
  {
     open my $wh,'>',"e$count.txt" or die "Error creating $!";
     print $wh $line;
     for(1..4){
        if(my $v = scalar <$fh>){
           print $wh  $v ;
        }
        else{
           last ;
        }
     }
     $count++;
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...