I recently wanted to download my bank transactions from E*Trade, but they do not support Excel format for the bank statements (only brokerage). You can, however, download 3 months of Quicken QFX data at a time. I downloaded several files spanning the year-to-date, but then needed a program to parse up the files and output a tab delimited text file. So, for a try in formatting code, here’s what I got:
#!/usr/bin/perl -w # Dan Minear # 2011-09-01 # # process Quicken QFX files and output tab delimited text file # # call use strict; use FileHandle; use Data::Dumper; my $data = {}; my $capture = 0; # don't capture my %txntypes = (); if (@ARGV < 1) { die "Syntax: $0\nExample: $0 09*.QFX\n"; } my $fo = FileHandle->new( "> out.txt"); if (! defined $fo) { die "Cannot write file"; } while (my $fname = shift) { print $fname . "\n"; my $fi = FileHandle->new("< $fname"); if (defined $fi) { my $txn = {}; while(<$fi>) { chomp; chop; # look for if (/^ /) { #start of record $capture = 1; $txn = {}; next; } if (/<\/STMTTRN>/) { # end of record $capture = 0; # add to data hash if (defined $data->{$txn->{FITID}}) { print "FITID $txn->{FITID} already defined\n"; } else { $data->{$txn->{FITID}} = $txn; $txntypes{$txn->{TRNTYPE}} = 1; } } if ($capture) { /<(\w+)>(.+)$/; $txn->{$1} = $2; } } } else { die "cannot open $fname for reading"; } $fi->close; } print "there are " . keys(%$data) . " transactions in files\n"; #print $fo Dumper( $data ); print $fo "DATE\tTYPE\tCREDIT\tDEBIT\tNAME\tMEMO\n"; foreach my $i (keys(%$data)) { my $t = $data->{$i}; # ref to hash my $date = $t->{DTPOSTED}; if ($t->{TRNAMT} < 0) { # it's a debit print $fo substr($date,0,4) . "-" . substr($date,4,2) . "-" . substr($date,6,2) . "\t" . $t->{TRNTYPE} . "\t" . "\t" . $t->{TRNAMT} . "\t" . $t->{NAME} . "\t" . $t->{MEMO} . "\n"; } else { # it's a credit print $fo substr($date,0,4) . "-" . substr($date,4,2) . "-" . substr($date,6,2) . "\t" . $t->{TRNTYPE} . "\t" . $t->{TRNAMT} . "\t" . "\t" . $t->{NAME} . "\t" . $t->{MEMO} . "\n"; } } $fo->close; =head1 uncomment to print out transaction types foreach (keys(%txntypes)) { print $_ . "\n"; } =cut