-2

毎月の財務記録を読むためにpdfリーダーを使用しています。私が興味を持っているすべての行は、説明で始まり、次に日付 ##/##/####、次に 2 ドルの金額 $#.## $#.## です。

このような:

Gas Station            12/12/2012         $68.00             $485.00

場合によっては、返品またはマイナスの金額を示すために、数字に括弧 $(4.50) が含まれることがあります。この「パターン」に準拠するすべての行を、1 行あたり 4 項目のリストとして返すようにします。そのため、行全体を未定のスペースと、場合によっては価格の括弧で一致させています。

require 'pdf-reader'
reader = PDF.Reader.new("month.pdf")
reader.pages.each do |page|
  page.split("\n").each do |line|
  if line # MATCHING REGEX HERE
     #HANDLE 4 VALUES FROM REGEX
  end
end

私がコードをどのように使用したかを知りたい人は、ソースhttps://github.com/danielpclark/INGdirect_pdf_processorを参照してください。銀行データを処理するための独自のプロジェクトで自由に使用してください。

4

2 に答える 2

2

この正規表現を試してください:

(.*)\s+(\d{2}\/\d{2}\/\d{4})\s*(\(?\$\d+\.\d+\)?)\s+(\(?\$\d+\.\d+\)?)

4 つの一致があります。

  • 説明
  • 日にち
  • 最初の金額
  • 第二の量

ここにRubularがあります:http://rubular.com/r/2mcrGZiAOe

名前付きマッチはもう少し洗練されているxため (複数行の正規表現の修飾子でもあります)、名前付きマッチを使用することもできます。

if line_match = line.match(/
    (?<description>.*)\s+
    (?<date>\d{2}\/\d{2}\/\d{4})\s*
    (?<amount_1>\(\$\d+\.\d+\)|\$\d+\.\d+)\s+
    (?<amount_2>\(\$\d+\.\d+\)|\$\d+\.\d+)/x)
  # now you can use: line_match[:date], line_match[:amount_1], etc.
于 2013-01-06T01:55:56.923 に答える
1

String.scan次のようなデータを追跡するのに適した方法です。

string = 'This is some text
Gas Station   12/12/2012 $68.00   $485.00
This some more text
Reimbursement 01/01/2012 $(68.00) $(485.00)
'

string.scan(%r{^(.+?) \s+ (\d{1,2}/\d{1,2}/\d{4}) \s+ ([$()\d.]+) \s+ ([$()\d.]+) }x)
[
    [0] [
        [0] "Gas Station",
        [1] "12/12/2012",
        [2] "$68.00",
        [3] "$485.00"
    ],
    [1] [
        [0] "Reimbursement",
        [1] "01/01/2012",
        [2] "$(68.00)",
        [3] "$(485.00)"
    ]
]
于 2013-01-06T04:13:10.307 に答える