0

我正在解析 PDF 文件并且有 2 个地址左对齐。除了城市下方的线外,州和邮政编码也分开。

右边的地址总是从索引 > 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由应用程序生成,因此它们是受控的

4

3 回答 3

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
}
于 2013-01-19T20:02:05.363 回答
0

您可以使用 match 和 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 将包含第二个地址。

这确实假设地址之间有一个空格,并且地址将至少以一位数字开头。

于 2013-01-19T18:45:58.410 回答
-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';
于 2013-01-20T17:50:20.330 回答