#!/usr/bin/env ruby # encoding: UTF-8 require 'csv' require 'iconv' @converter = Iconv.new("ISO8859-15", "utf-8") date = /\d\d [A-Z][a-z][a-z] \d\d\d\d/ string = /.*/ nothing = /^$/ amount = /£\d+\.\d\d/ money_in = [date, string, nothing, amount, amount] money_out = [date, string, amount, nothing, amount] def normalise(t) t.map { |s| s.to_s.gsub("\xA3".force_encoding(Encoding.aliases["ISO8859-15"]), "£").force_encoding(Encoding.default_external) } end def transaction_type(array, pattern) !array.empty? && array.zip(pattern).inject(true) {|m, (string, pattern)| m && string =~ pattern} end def date(transaction) Date.parse(transaction[0]).strftime("%d/%m/%Y") end def description(transaction) transaction[1].strip[0..31] end def outgoing(transaction) transaction[2].gsub("£", "-") end def incoming(transaction) transaction[3].gsub("£", "") end CSV.open(ARGV[1], "wb") do |o| CSV.foreach(ARGV[0], :encoding => Encoding.aliases["ISO8859-15"]) do |t| t = normalise(t) if transaction_type(t, money_in) o << [date(t), incoming(t), description(t)] elsif transaction_type(t, money_out) o << [date(t), outgoing(t), description(t)] end end end