【发布时间】:2019-04-22 11:54:03
【问题描述】:
我陷入了一个看似微不足道的问题,但不确定我错过了什么。需要帮助。
我有一个由标准字段分隔符 (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");
}
【问题讨论】:
-
您在问题中说记录分隔符是
0x1e,但您的代码使用的是0xa(换行符)。是哪个? -
@Schwern 很抱歉。我正在调整代码以查看使用换行符设置
$/的行为。无意中发布了该 WIP 代码。感谢您的发现。
标签: perl parsing text-processing