class FnbPdfToCsv

Constants

AMOUNT
DATE
VERSION

Attributes

lines[R]

Public Class Methods

new(file) click to toggle source
# File lib/fnb_pdf_to_csv.rb, line 11
def initialize file
  @reader = ::PDF::Reader.new file
  @lines = []
end
parse(file) click to toggle source
# File lib/fnb_pdf_to_csv.rb, line 16
def self.parse file
  parser = self.new(file)
  parser.parse
  parser
end

Public Instance Methods

clean_amount(amount) click to toggle source
# File lib/fnb_pdf_to_csv.rb, line 75
def clean_amount(amount)
  return amount if amount.nil?
  return 0 - amount[1..-2].to_f if amount[0] == '(' and amount[-1] == ')'
  if amount[-2..-1] == 'Cr'
    return amount[0..-3].tr(',', '').to_f
  else
    return 0 - amount.tr(',', '').to_f
  end
end
clean_date(date) click to toggle source
# File lib/fnb_pdf_to_csv.rb, line 70
def clean_date(date)
  day, month = date.split(/\s/)
  Time.new(Time.new.year, month, day.to_i).strftime("%Y-%m-%d")
end
clean_line(line) click to toggle source
# File lib/fnb_pdf_to_csv.rb, line 85
def clean_line(line)
  sline = line.dup
  sline[0] = clean_date sline[0]
  sline[4] = clean_amount sline[4]
  sline[5] = clean_amount sline[5]
  sline[6] = clean_amount sline[6]

  sline
end
mangle_line!(arr) click to toggle source
# File lib/fnb_pdf_to_csv.rb, line 95
def mangle_line! arr
  arr.delete_at 0
  arr.map! { |elm| elm.strip unless elm.nil? } # Cleanup

  arr.delete_at 3
  arr.delete_at 4
  arr.delete_at 5
  arr[1] = arr[1].split(/\s{2,}/) # We get the three descriptions as one string
  arr.insert(2, arr[1][1])        # So split them up and add them back
  arr.insert(3, arr[1][2])
  arr[1] = arr[1][0]
  arr
end
output(file, separator = ',') click to toggle source
# File lib/fnb_pdf_to_csv.rb, line 26
def output file, separator = ','
  f = File.new file, 'w'
  f.write [
    'Date','Description1','Description2','Description3','Amount','Balance','Accrued Charges'
  ].to_csv(col_sep: separator)

  lines.each { |line| f.write clean_line(line).to_csv(col_sep: separator) }
end
parse() click to toggle source
# File lib/fnb_pdf_to_csv.rb, line 22
def parse
  @reader.pages.each { |page| parse_page page }
end
parse_line(line) click to toggle source
# File lib/fnb_pdf_to_csv.rb, line 64
def parse_line line
  line.match(/^\s*(#{DATE})(.*?)(#{AMOUNT})\s+(#{AMOUNT})(\s+#{AMOUNT})?$/) do |m|
    @lines.push mangle_line!(m.to_a)
  end
end
parse_page(page) click to toggle source
# File lib/fnb_pdf_to_csv.rb, line 60
def parse_page page
  page.text.each_line { |line| parse_line line }
end
statement(file) click to toggle source
# File lib/fnb_pdf_to_csv.rb, line 35
def statement file
  f = File.new file, 'w'
  f.write "5,'Number','Date','Description1','Description2','Description3','Amount','Balance','Accrued Charges'\n"

  count = 1
  lines.each do |line|
    f.write statement_line(line, count).join(',') + "\n"
    count = count + 1
  end
end
statement_line(line, count) click to toggle source
# File lib/fnb_pdf_to_csv.rb, line 46
def statement_line line, count
  sline = line.dup
  sline.insert(0, 5)
  sline.insert(1, count)
  sline[2] = "'#{sline[2]}'"
  sline[3] = '"' + sline[3] + '"' unless (sline[3].nil? or sline[3] == '')
  sline[4] = '"' + sline[4] + '"' unless (sline[4].nil? or sline[4] == '')
  sline[5] = '"' + sline[5] + '"' unless (sline[5].nil? or sline[5] == '')
  sline[6] = clean_amount(sline[6])
  sline[7] = clean_amount(sline[7])

  sline
end