Как я могу обработать двоичный файл записей фиксированной длины без разрывов строк между ними? - PullRequest
1 голос
/ 06 августа 2009

У меня есть текстовый файл, который состоит из записей фиксированной длины, но все в одной строке без разрывов строк между ними. Какой лучший способ обработать это в Perl? Спасибо!

Ответы [ 3 ]

8 голосов
/ 06 августа 2009

Сначала давайте откроем файл и убедимся, что он находится в режиме bin:

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

Теперь установите разделитель входной записи на ссылку на длину ваших записей (предположим, 120 байтов на запись):

local $/ = \120;

Теперь давайте прочитаем записи:

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

А теперь, если вы хотите извлечь из него данные, вам нужно написать распаковать вещь:

  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;
5 голосов
/ 06 августа 2009

используйте функцию 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 голосов
/ 06 августа 2009

unpack () может пригодиться здесь. Вы можете указать список символов (используя 'c', 'C' или 'W'), и он будет автоматически распакован в список. См. pack документацию для вариантов использования.

...