perl - 使用 Perl 解析文本文件的最有效方法是什么?

标签 perl parsing optimization field text-files

虽然这是非常基本的,但我找不到类似的问题,所以如果您知道关于 SO 的现有问题/解决方案,请链接到一个。

我有一个 .txt大约 2MB 和大约 16,000 行长的文件。每个记录长度为 160 个字符,分 block 因子为 10。这是一种较旧类型的数据结构,几乎看起来像一个制表符分隔的文件,但分隔是由单字符/空格分隔的。

一、我glob .txt 的目录files - 目录中一次不会有多个文件,因此这种尝试本身可能效率低下。

my $txt_file = glob "/some/cheese/dir/*.txt";

然后我用这一行打开文件:
open (F, $txt_file) || die ("Could not open $txt_file");

根据该文件的数据字典,我使用 Perl 的 substr() 解析每一行中的每个“字段”。在一个while循环中运行。
while ($line = <F>)
{
$nom_stat   = substr($line,0,1);
$lname      = substr($line,1,15);
$fname      = substr($line,16,15);
$mname      = substr($line,31,1);
$address    = substr($line,32,30);
$city       = substr($line,62,20);
$st         = substr($line,82,2);
$zip        = substr($line,84,5);
$lnum       = substr($line,93,9);
$cl_rank    = substr($line,108,4);
$ceeb       = substr($line,112,6);
$county     = substr($line,118,2);
$sex        = substr($line,120,1);
$grant_type = substr($line,121,1);
$int_major  = substr($line,122,3);
$acad_idx   = substr($line,125,3);
$gpa        = substr($line,128,5);
$hs_cl_size = substr($line,135,4);
}

这种方法需要花费大量时间来处理每一行,我想知道是否有一种更有效的方法可以将每个字段从文件的每一行中取出。

任何人都可以提出更有效/首选的方法吗?

最佳答案

在我看来,您在这里使用的是固定宽度的字段。真的吗?如果是, unpack 功能是你所需要的。您为字段提供模板,它将从这些字段中提取信息。有一个tutorial可用,模板信息可在 pack 的文档中找到这是unpack的逻辑逆。作为一个简单的基本示例:

my @values = unpack("A1 A15 A15 ...", $line);

其中“A”表示任何文本字符(据我所知),数字是多少。 unpack 是一门艺术有些人使用它,但我相信这足以满足基本使用。

关于perl - 使用 Perl 解析文本文件的最有效方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5173383/

相关文章:

perl - 使用 Perl 插入到 PostgreSQL 表中

perl - CPAN shell 内存不足。如何在 Unix 上给它更多内存?

javascript - 使用 PEG.js 解析计算

c - 64 位整数的签名饱和加法?

performance - “共享”或 'cache' 仅由不明确类型参数化的表达式?

python - 内存优化,用于生成大于 RAM 的数据

windows - 如何阻止 Perl 程序在完成后关闭其窗口?

perl - 如何理解POEM-To destroy的使用?

python - 检查Python中分隔符后面的字符是否存在

java - JSON:使用 JSON 数据创建网页