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

match with 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には2番目のアドレスが含まれます。

これは、アドレス間にスペースがあり、アドレスが少なくとも1桁で始まることを前提としています。

于 2013-01-19T18:45:58.410 に答える
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 に答える
-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 に答える