OCRのテキスト出力を解析することは、フラストレーションとコーナーケースでの演習です。遭遇する可能性のあるさまざまな種類のデータを処理するためには、実際にパーサーを実装する必要があります。あなたのパーサがのCORRECTであることを知るよい方法はありません。将来解決策が得られる可能性があります。脆いと潜在的にバグです。
#!/usr/bin/env perl
use warnings;
use strict;
use Data::Dumper;
$Data::Dumper::Sortkeys = 1;
my @fields;
my @extra_descriptions;
my @results;
open my $fh, "<input" or die "Unable to open 'input' : $!";
while(<$fh>) {
my @data;
chomp(); # Remove newline
s|^\s+||; # Remove leading spaces
s|\s+$||; # Remove trailing spaces
next unless m|\w|; # Skip empty lines
@data = split/\s\s+/; # Split on 2 or more spaces
# Parse Header
if ($. == 1) {
@fields = @data;
next;
}
if (1 == scalar @data) {
# Extra Size Description
push @extra_descriptions, shift @data;
next;
} elsif (4 == scalar @data or 5 == scalar @data) {
my $sn = shift @data;
my $desc = '';
# Deal with possibly missing Size info
if (4 == scalar @data) {
my $size = shift @data;
$desc = join(', ', $size, @extra_descriptions);
} else {
# 3 columns, so missing Size info
# Reverse because now main description is last
$desc = join(', ', reverse @extra_descriptions);
}
unshift(@data, $sn, $desc);
# Data should be 5 columns
(5 == scalar @data) or die "Something went wrong with data: " . join("\n",@data);
# Size (description) should be column 1 (second column)
$data[1] =~ m|[FWx]| or die "Could not figure out size! $data[1]";
my %row;
my @field_names = qw(serialno size quantity unit_price total_price);
for my $i (0 .. $#field_names) {
my $name = $field_names[$i];
my $desc = $name . "_desc";
$row{$name} = $data[$i];
$row{$desc} = $fields[$i];
}
# TODO: Insert data into database here
print Dumper(\%row);
# Reset
undef @extra_descriptions;
} else {
# Not 1, 4 or 5 columns
die "Do not know what to do about this row: '$_'";
}
}
出力スタックオーバーフローする
$VAR1 = {
'quantity' => '1 SET',
'quantity_desc' => 'QTY',
'serialno' => '01',
'serialno_desc' => 'S/NO',
'size' => 'FW-50(S) (5 x 5 x 2 MH)',
'size_desc' => 'INSULATED TANK SIZE',
'total_price' => '131,592.00',
'total_price_desc' => 'TOTAL PRICE (Qr.)',
'unit_price' => '131,592.00',
'unit_price_desc' => 'U.PRICE(Qr.)'
};
$VAR1 = {
'quantity' => '1 SET',
'quantity_desc' => 'QTY',
'serialno' => '02',
'serialno_desc' => 'S/NO',
'size' => 'FW-120(S) (10 x 6 x 2 MH) w/p, w/p(3+2)',
'size_desc' => 'INSULATED TANK SIZE',
'total_price' => '252,330.00',
'total_price_desc' => 'TOTAL PRICE (Qr.)',
'unit_price' => '252,330.00',
'unit_price_desc' => 'U.PRICE(Qr.)'
};
$VAR1 = {
'quantity' => '1 SET',
'quantity_desc' => 'QTY',
'serialno' => '03',
'serialno_desc' => 'S/NO',
'size' => 'FW-2(S) (1 x 2 x 1 MH) w/p (1+1), (5+5)',
'size_desc' => 'INSULATED TANK SIZE',
'total_price' => '14,471.00',
'total_price_desc' => 'TOTAL PRICE (Qr.)',
'unit_price' => '14,471.00',
'unit_price_desc' => 'U.PRICE(Qr.)'
};
ようこそ:道のうち、その注意点が
は、ここにあなたが進むかもしれない一つの方法です。残念ながらあなたの仕事はできませんでした。 PHPやperlで何か試してみましたか? – ssr1012
これはcsv文書(タブ区切り)か、スペース区切りの列だけですか? – ssr1012
はい、私はPDFからそれらのデータを読み取るためにいくつかの正規表現を試しましたが、列のINSULATED TANK SIZEからデータを読み取ることができず、それはスペース区切りの列です。 –