使用perl用空格分隔的2个邮件地址解析行的最佳方法

时间:2013-01-19 17:40:14

标签: regex perl

我正在解析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是由应用程序生成的,因此可以控制它们

3 个答案:

答案 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';