如何处理固定长度记录的二进制文件,中间没有换行符?

时间:2009-08-06 14:06:51

标签: perl binaryfiles

我有一个文本文件,它由固定长度的记录组成,但都在一行中,两者之间没有换行符。在Perl中处理它的最佳方法是什么?谢谢!

3 个答案:

答案 0 :(得分:8)

首先,让我们打开文件,确保它处于bin模式:

open my $fh, '<', 'file.name' or die "Cannot open file.name: $!";
binmode $fh;

现在,设置输入记录分隔符以引用记录的长度(假设每个记录120个字节):

local $/ = \120;

现在,让我们阅读记录:

while (my $record = <$fh>) {

现在如果你想从中获取数据,你必须写一些unpack的东西:

  my @elements = unpack("......", $record);

现在你可以处理@elements,并完成while(){}循环:

  ...
}

整个“程序”:

open my $fh, '<', 'file.name' or die "Cannot open file.name: $!";
binmode $fh;
local $/ = \120;
while (my $record = <$fh>) {
  my @elements = unpack("......", $record);
  ...
}
close $fh;

答案 1 :(得分:5)

使用read FILEHANDLE,SCALAR,LENGTH函数一次将一个块读入缓冲区......

use constant LEN => 60;
while (!eof $fh) {
    my $len = read $fh, $buf, LEN;
    die "short read" if $len < LEN;
    # processing...
}

...并使用正则表达式unpack或者您喜欢的方式处理缓冲区。

答案 2 :(得分:2)

unpack()可能在这里有用。您可以指定字符列表(使用“c”,“C”或“W”),它将自动解压缩到列表中。有关要使用的选项,请参阅pack文档。