虽然这是非常基本的,但我找不到类似的问题,所以如果您知道关于 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/