2016-09-30 9 views
-5

正規表現を使用して列方向のデータを読み取る方法列を分割する方法など、これらのデータをデータベースに格納します。正規表現を使用して列方向のデータを取得

S/NO   INSULATED TANK SIZE   QTY  U.PRICE(Qr.)  TOTAL PRICE (Qr.) 
     FW-50(S) (5 x 5 x 2 MH) 
01          1 SET  131,592.00   131,592.00 
       w/p(3+2) 
     FW-120(S) (10 x 6 x 2 MH) w/p 
02          1 SET  252,330.00   252,330.00 
        (5+5) 
03  FW-2(S) (1 x 2 x 1 MH) w/p (1+1) 1 SET  14,471.00    14,471.00 

私は、Linuxのコマンドを使用してテキストファイルにPDFに変換していると私は私が何をすべき賢明その後、データ列を読みたいですか?

+2

ようこそ:道のうち、その注意点が

は、ここにあなたが進むかもしれない一つの方法です。残念ながらあなたの仕事はできませんでした。 PHPやperlで何か試してみましたか? – ssr1012

+0

これはcsv文書(タブ区切り)か、スペース区切りの列だけですか? – ssr1012

+0

はい、私はPDFからそれらのデータを読み取るためにいくつかの正規表現を試しましたが、列のINSULATED TANK SIZEからデータを読み取ることができず、それはスペース区切りの列です。 –

答えて

0

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.)' 
     }; 
関連する問題