我正在解析PDF文件并且有两个左对齐的地址。除了城市下方的线路,州和拉链也是分开的。
右边的地址始终以索引>开头。 150(从行开始)。我可以触发索引>中任何文本的匹配。 150并停在\ n换行符,但此方法似乎内存密集且速度慢。我在pdf中有大约200行文字。我也知道地址线(共7个)总是出现在第40行和第48行之间。寻找一些简单的替代方法来解析这些数据。
1011 VALLEY BELT RD 4569 EAST TWINSBURG ROAD\n
open (FILE, "pdftotext -layout file.pdf - |");
while(<FILE>) {
$i++;
my($line) = $_;
$line=~s/\n$/ | [NL]/; # just to visualize the newline on screen
print "\n<div class=\"line\"><div>$i</div>$line</div>";
}
close FILE;
pdf是由应用程序生成的,因此可以控制它们
答案 0 :(得分:0)
您可以使用与regrex的匹配来获取该行中的项目。使用分组,您可以进行匹配,然后保存地址。
根据提供的数据样本,我想出了以下内容:
while ( <DATA> ) {
chomp;
m/(\d+\s+.*)\s+(\d+\s+.*)/;
print "$1\n";
print "$2\n";
}
__DATA__
1011 VALLEY BELT RD 4569 EAST TWINSBURG ROAD
$ 1将包含第一个地址,$ 2将包含第二个地址。
这确实假设地址之间有空格,地址将以至少一个数字开头。
答案 1 :(得分:0)
如果您确定要处理固定宽度数据,可以使用unpack
提取字段:
use strict;
use warnings;
use Data::Dumper;
# creating your input string
my $str = sprintf "%-150s%s\n", "1011 VALLEY BELT RD",
"4569 EAST TWINSBURG ROAD";
# unpack 150 ascii chars, space padded (A150) and same to end of string (A*)
my ($first, $second) = unpack "A150A*", $str;
print Dumper $first, $second;
<强>输出:强>
$VAR1 = '1011 VALLEY BELT RD';
$VAR2 = '4569 EAST TWINSBURG ROAD';
如果您知道此数据所在的行号,则可以使用行号变量$.
找到正确的位置。例如:
while (<FILE>) {
next unless $. >= 40;
# do stuff here
}
答案 2 :(得分:-1)
@TLP基于Dumper的完整解决方案
**地址
1011 VALLEY BELT RD 4569 EAST TWINSBURG ROAD\n
Philadelphia, PA Kansas City, MO\n
18659 69869\n
**代码
use strict;
use warnings;
use Data::Dumper;
my $i=0;
my $lAddr;
my $rAddr;
open (FILE, "pdftotext -layout file.pdf - |");
while(<FILE>) {
$i++;
my($line) = $_;
if ($i>40 && $i<=48) {
# unpack 150 ascii chars, space padded (A150) and same to end of string (A*)
my ($VAR1, $VAR2) = unpack "A150A*", $line;
$lAddr.=$VAR1;
$rAddr.=$VAR2;
}
}
close FILE;
<强>输出:强>
$lAddr = '1011 VALLEY BELT RD Philadelphia, PA 18659';
$rAddr = '4569 EAST TWINSBURG ROAD Kansas City, MO 69869';