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

发布于 2024-07-29 20:34:45 字数 69 浏览 2 评论 0原文

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

I have a text file that's composed of fixed length records but all in one line with no line breaks in between. What's the best way to process it in Perl? Thanks!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

紙鸢 2024-08-05 20:34:45

首先,让我们打开文件,并确保它处于 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;

First, let's open the file, and make sure it's in bin mode:

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

Now, set input record separator to reference to length of your records (let's assume 120 bytes per record):

local $/ = \120;

Now, let's read the records:

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

And now if you want to get data out of it, you have to write some unpack thing:

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

Now you can process @elements, and finish while() {} loop:

  ...
}

Whole "program":

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;
木緿 2024-08-05 20:34:45

使用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或处理缓冲区不管你喜欢什么。

use the read FILEHANDLE,SCALAR,LENGTH function to read a block at a time into a buffer...

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

... and process the buffer using regular expressions, unpack, or however you like.

哀由 2024-08-05 20:34:45

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

unpack() may be of use here. You can specify the list of characters (using 'c', 'C' or 'W') and it'll unpack automatically into a list. See the pack documentation for the options to use.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文