从每列读取数据,最后在perl中连续打印

时间:2013-12-10 00:33:34

标签: perl file-handling seek

我正在编写脚本来读取大文件(> 10 GB),并将数据中的数据写入该文件中每行的末尾。这是我的代码

   my $count=0;
   while(my $lines = <$FILE>){
        seek $FILE, length($lines), 1;
        print $FILE "\t", $array[$count];
        $count++;
        }

但我认为使用搜索方法找到行尾是错误的。我无法理解这一点。任何人都可以在这段代码中看到错误。在处理之前..

my 1st line
my 2nd line
my 3rd line

处理后......

my 1st line data1
my 2nd line data2
my 3rd line data3

data1,data2,data3在@array中。

代码详情:

  • FILE以+&lt;打开。模式(读/写)
  • FILE行以制表符分隔。
  • @array持有data1,2 ......

的问题:

  • 将指针移动到每行的末尾

谢谢,

罗宾

1 个答案:

答案 0 :(得分:2)

你做不到。寻找文件中的某个位置然后打印到该位置会覆盖该位置的数据。

我建议您使用Tie::File,它允许您将文件的内容作为数组进行访问,因此只需将字符串添加到其中一个元素中即可附加到文件行的末尾。数组。

代码看起来像这样。请注意,创建@newdata的行仅用于测试。它会创建一个与文件长度相同的数组,其中包含data1data2等行,就像您的问题一样。

您最初应该在较小的文件上对此进行测试,因为处理15GB文件需要一段时间,并且还会覆盖它,因此如果您有任何错误,则会破坏您的数据。

use strict;
use warnings;

use Tie::File;
use Fcntl 'O_RDWR';

tie my @file, 'Tie::File', 'myfile', mode => O_RDWR or die $!;

my @newdata = map sprintf('data%d', $_ + 1), 0 .. $#file;

my $i = 0;
for my $line (@file) {
  $line .= "\t" . $newdata[$i];
  ++$i;
}

untie @file;