perl - Perl 记录分隔符 -
问题描述
我被困在一个看似微不足道的问题上,但不确定我错过了什么。需要帮忙。
我有一个由标准字段分隔符 ( 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");
}
解决方案
您可以使用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);
}
推荐阅读
- django - 在 Django 中填充 db.sqlite:本地主机和生产
- python - 如何使用 Windows 文件资源管理器使用 Python 选择和返回目录?
- streamlit - streamlit date_input 小部件的切换语言
- web-services - Coldfusion 2021 (java 11) 上的 Web 服务中断
- docker - 使用 Flask Swagger 在云端加载 API 定义失败
- google-apps-script - 有没有办法跟踪 Google 表格用户的电子邮件?
- cats-effect - 当前 cat-effects IO 错误处理技术的现状如何?
- c# - 我需要帮助弄清楚如何将浮点值等转移到我的武器系统中的另一个脚本中
- flutter - Flutter 中的同步机制
- sap-cloud-sdk - SAP OData 生成器为导航条目生成错误 URL