vishal
vishal

Reputation: 11

I want to write multiple files from one file without using array to remove complexity

I want to write multiple files from one file (getting latest data every time) without using array to remove complexity. I already tried it using array but when data is high than it will slow down the process.

Kindly give some hint to me how I will remove the complexity of the program.

Input: read a text file from a directory.

Output:

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

I do this using array:

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

Upvotes: 1

Views: 67

Answers (2)

zdim
zdim

Reputation: 66883

Store lines in a small buffer, and open a file every fifth line and write the buffer to it

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

Upvotes: 4

mkHun
mkHun

Reputation: 5927

As I observed from your code You can try this

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

Upvotes: 1

Related Questions