Разделитель записей Perl - - PullRequest
0 голосов
/ 20 ноября 2018

Я застрял на кажущейся тривиальной проблеме, но не уверен, что мне не хватает. Нужна помощь.

У меня есть файл, который разделен стандартным разделителем полей (0x1f) и разделителем записей (0x1e). (https://en.wikipedia.org/wiki/Delimiter#ASCII_delimited_text)

Мне не нужно разбирать поля, но я хочу получить записи.

Я прочитал о специальной переменной Perl для разделения записей и попытался использовать ее для анализа файла.

Файл выглядит следующим образом. ^ представляет разделитель полей, а ^^ представляет разделитель записей (в vim). На возвышенных они будут отображаться как соответствующие шестнадцатеричные коды.

ID^_NAME^_PARENTID^_Prov ID^_Pat_ID^_Another ID^_Program1^_Program2^_Status^_Date^_Reason^_Added^_Sn Length^_ze Reason^_StAge^_EnAge^_Notes^^NUMBER^_VARCHAR^_NUMBER^_    NUMBER^_NUMBER^_NUMBER^_VARCHAR^_VARCHAR^_VARCHAR^_DATE^_VARCHAR^_VARCHAR^_VARCHAR^_VARCHAR^_VARCHAR^_VARCHAR^_VARCHAR^^12^_40^_12^_^_12^_12^_200^_200^_12^_^_200^_1^_    4000^_4000^_2000^_2000^_4000^^0^_^_0^_^_0^_0^_^_^_^_^_^_^_^_^_^_^_^^

Ниже приведен код, который я написал для разбора записей. Проблема в том, что я делаю, весь файл считывается в скаляр $ row.

Я изначально предполагал, что perl ожидает, что $/ будет установлен в строковый тип. Это тоже не работает, и я застрял.

Ценю любую помощь. Спасибо.

#local $/ = sprintf("%s",chr("0xa"));
local $/ = chr(0xa);

open my $fh, "<", $file or die "$file: $!";

print("reading records\n");

while (my $row = <$fh>) {
    print("Record:", $row, "\n");
}

1 Ответ

0 голосов
/ 20 ноября 2018

Вы можете использовать chr(0xNN), но проще написать шестнадцатеричный символ как "\xNN". Строка, содержащая разделитель записей: "\x1e".

#!/usr/bin/env perl

use strict;
use warnings;
use v5.10;

my $file = shift;
open my $fh, "<", $file or die "$file: $!";

say "reading records";

local $/ = "\x1e";
while (my $row = <$fh>) {
    say("Record:", join ",", split /\x1f/, $row);
}
...