【问题标题】:Read data from each column and finally print it in a row in perl从每一列读取数据,最后在perl中打印成一行
【发布时间】:2013-12-10 00:33:34
【问题描述】:

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

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

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

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 行是制表符分隔的。
  • @array 保存 data1,2...

问题:

  • 将指针移到每行的末尾

谢谢,

罗宾

【问题讨论】:

  • 为什么不创建一个新文件,每行都附加数据?
  • 请记住,您打印的数据不是“插入”的;它只是覆盖已经存在的任何内容。在具有固定长度记录的二进制文件中,这可能没问题。在您的情况下,您似乎正在覆盖当前数据(包括换行符)。写出第二个文件可能会更容易。
  • 感谢 @Kenosis@rutter 的建议。这里的问题是我正在编写的文件将有数百万行和 1000 列,尽管我可能从空白文件开始。对于所有数据数组,该文件必须被写入 (lines * cols) 次。这将是一个性能瓶颈。所以我试图用另一种方式来优化性能。我会尝试 @Borodin 的建议,并会尽快更新主题!!

标签: perl file-handling seek


【解决方案1】:

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

我建议您使用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;

【讨论】:

  • 非常感谢@Borodin。有用!!。我这里有个简单的问题...当我们将文件绑定到数组时,文件数据(行)会存储在内存中吗??
猜你喜欢
  • 2014-07-14
  • 1970-01-01
  • 2013-10-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多