Skip to content

Instantly share code, notes, and snippets.

@kejadlen
Created January 6, 2018 04:59
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save kejadlen/0cd4688dec819751f2ae6ebe6c7a1c06 to your computer and use it in GitHub Desktop.
Save kejadlen/0cd4688dec819751f2ae6ebe6c7a1c06 to your computer and use it in GitHub Desktop.
require "date"
require "strscan"
module QFX
Transaction = Struct.new(:type, :date, :amount, :fitid, :name, keyword_init: true)
class Parser
def initialize(raw)
@ss = StringScanner.new(raw)
end
def parse
until @ss.eos?
case
when @ss.scan(/<BANKTRANLIST>\n/)
return parse_transaction_list
else
@ss.skip_until(/\n/)
end
end
end
private
def parse_transaction_list
transactions = []
transaction = {}
until @ss.scan(/<\/BANKTRANLIST>\n/)
case
when @ss.scan(/<STMTTRN>\n/)
transaction = {}
when @ss.scan(/<TRNTYPE>((?~\n))\n/)
transaction[:type] = @ss[1].downcase.to_sym
when @ss.scan(/<DTPOSTED>((?~\n))\[(?~\])\]\n/)
transaction[:date] = Date.parse(@ss[1])
when @ss.scan(/<TRNAMT>((?~\n))\n/)
transaction[:amount] = BigDecimal(@ss[1])
when @ss.scan(/<FITID>((?~\n))\n/)
transaction[:fitid] = @ss[1].to_i
when @ss.scan(/<NAME>((?~\n))\n/)
transaction[:name] = @ss[1]
when @ss.scan(/<\/STMTTRN>\n/)
transactions << Transaction.new(transaction)
else
@ss.skip_until(/\n/)
end
end
transactions
end
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment