├── README ├── convert.py ├── input.csv ├── output.iif └── template /README: -------------------------------------------------------------------------------- 1 | Simple script to parse Bank of America visa statement and convert it to Quickbooks IIF file format. 2 | 3 | 4 | Bugs: 5 | * Can't deal with refunds in credit card statement. I dealt with the problem manually. -------------------------------------------------------------------------------- /convert.py: -------------------------------------------------------------------------------- 1 | # Script to convert CSV to IIF output. 2 | 3 | import os 4 | import sys, traceback, re 5 | 6 | PROJECT_ROOT = os.path.dirname(os.path.realpath(__file__)) 7 | 8 | 9 | def error(trans): 10 | sys.stderr.write("%s\n" % trans) 11 | traceback.print_exc(None, sys.stderr) 12 | 13 | 14 | def main(input_file_name): 15 | input_file = open(os.path.join(PROJECT_ROOT, input_file_name), 'r') 16 | output_file = open(os.path.join(PROJECT_ROOT, input_file_name + '.iif'), 'w') 17 | 18 | 19 | # This is the name of the QuickBooks checking account 20 | account = "BofA Credit Card" 21 | 22 | # This is the IIF template 23 | 24 | head = "!TRNS TRNSID TRNSTYPE DATE ACCNT NAME CLASS AMOUNT DOCNUM MEMO CLEAR TOPRINT NAMEISTAXABLE DUEDATE TERMS PAYMETH SHIPVIA SHIPDATE REP FOB PONUM INVMEMO ADDR1 ADDR2 ADDR3 ADDR4 ADDR5 SADDR1 SADDR2 SADDR3 SADDR4 SADDR5 TOSEND ISAJE OTHER1 ACCTTYPE ACCTSPECIAL\r\n"\ 25 | + "!SPL SPLID TRNSTYPE DATE ACCNT NAME CLASS AMOUNT DOCNUM MEMO CLEAR QNTY PRICE INVITEM PAYMETH TAXABLE EXTRA VATCODE VATRATE VATAMOUNT VALADJ SERVICEDATE TAXCODE TAXRATE TAXAMOUNT TAXITEM OTHER2 OTHER3 REIMBEXP ACCTTYPE ACCTSPECIAL ITEMTYPE\r\n"\ 26 | + "!ENDTRNS\r\n" 27 | 28 | output_file.write(head) 29 | 30 | template = "TRNS CREDIT CARD %s BofA Credit Card -%s %s N N %s N CCARD\r\n"\ 31 | + "SPL CREDIT CARD %s Ask My Accountant %s 0 %s 0.00 0.00 EXP\r\n"\ 32 | + "ENDTRNS\r\n" 33 | 34 | 35 | # And here's the part that inserts data into the tempalate 36 | for trans in input_file: 37 | trans = trans.strip() 38 | if trans == "": 39 | continue 40 | 41 | try: 42 | list = trans.split(',') 43 | assert (len(list) == 3 ) 44 | except: 45 | error(trans) 46 | continue 47 | 48 | try: 49 | (date, amount, comments) = list 50 | # date = date.replace('/', '-') 51 | except: 52 | error(trans) 53 | continue 54 | 55 | try: 56 | amount = float(amount) 57 | except: 58 | error(trans) 59 | continue 60 | 61 | comments = comments.strip('"') 62 | comments = comments.strip("\n") 63 | comments = comments.strip("\r") 64 | 65 | output_file.write(template % (date, amount, comments, date, 66 | date, amount, amount)) 67 | 68 | 69 | if __name__ == '__main__': 70 | 71 | if len(sys.argv) != 2: 72 | print "usage: python convert.py input.csv" 73 | 74 | main(sys.argv[1]) -------------------------------------------------------------------------------- /input.csv: -------------------------------------------------------------------------------- 1 | 3/17/11,5.45,APL*ITUNES 866-712-7753 CA 2 | 3/18/11,89.7,ALASKA AIR 0272165880138SEATTLE WA 3 | 3/22/11,20,BART CONCOURSE H S QPS 5104646979 CA 4 | 3/23/11,16.5,SURESH CHANDER SAN FRANCISCOCA 5 | 3/24/11,11.2,VTS SAN FRANCISCO LONG ISLAND CNY 6 | -------------------------------------------------------------------------------- /output.iif: -------------------------------------------------------------------------------- 1 | !TRNS TRNSID TRNSTYPE DATE ACCNT NAME CLASS AMOUNT DOCNUM MEMO CLEAR TOPRINT NAMEISTAXABLE DUEDATE TERMS PAYMETH SHIPVIA SHIPDATE REP FOB PONUM INVMEMO ADDR1 ADDR2 ADDR3 ADDR4 ADDR5 SADDR1 SADDR2 SADDR3 SADDR4 SADDR5 TOSEND ISAJE OTHER1 ACCTTYPE ACCTSPECIAL 2 | !SPL SPLID TRNSTYPE DATE ACCNT NAME CLASS AMOUNT DOCNUM MEMO CLEAR QNTY PRICE INVITEM PAYMETH TAXABLE EXTRA VATCODE VATRATE VATAMOUNT VALADJ SERVICEDATE TAXCODE TAXRATE TAXAMOUNT TAXITEM OTHER2 OTHER3 REIMBEXP ACCTTYPE ACCTSPECIAL ITEMTYPE 3 | !ENDTRNS 4 | TRNS CREDIT CARD 3/17/11 BofA Credit Card -5.45 APL*ITUNES 866-712-7753 CA N N 3/17/11 N CCARD 5 | SPL CREDIT CARD 3/17/11 Ask My Accountant 5.45 0 5.45 0.00 0.00 EXP 6 | ENDTRNS 7 | TRNS CREDIT CARD 3/18/11 BofA Credit Card -89.7 ALASKA AIR 0272165880138SEATTLE WA N N 3/18/11 N CCARD 8 | SPL CREDIT CARD 3/18/11 Ask My Accountant 89.7 0 89.7 0.00 0.00 EXP 9 | ENDTRNS 10 | TRNS CREDIT CARD 3/22/11 BofA Credit Card -20.0 BART CONCOURSE H S QPS 5104646979 CA N N 3/22/11 N CCARD 11 | SPL CREDIT CARD 3/22/11 Ask My Accountant 20.0 0 20.0 0.00 0.00 EXP 12 | ENDTRNS 13 | TRNS CREDIT CARD 3/23/11 BofA Credit Card -16.5 SURESH CHANDER SAN FRANCISCOCA N N 3/23/11 N CCARD 14 | SPL CREDIT CARD 3/23/11 Ask My Accountant 16.5 0 16.5 0.00 0.00 EXP 15 | ENDTRNS 16 | TRNS CREDIT CARD 3/24/11 BofA Credit Card -11.2 VTS SAN FRANCISCO LONG ISLAND CNY N N 3/24/11 N CCARD 17 | SPL CREDIT CARD 3/24/11 Ask My Accountant 11.2 0 11.2 0.00 0.00 EXP 18 | ENDTRNS 19 | -------------------------------------------------------------------------------- /template: -------------------------------------------------------------------------------- 1 | !TRNS TRNSID TRNSTYPE DATE ACCNT NAME CLASS AMOUNT DOCNUM MEMO CLEAR TOPRINT NAMEISTAXABLE DUEDATE TERMS PAYMETH SHIPVIA SHIPDATE REP FOB PONUM INVMEMO ADDR1 ADDR2 ADDR3 ADDR4 ADDR5 SADDR1 SADDR2 SADDR3 SADDR4 SADDR5 TOSEND ISAJE OTHER1 ACCTTYPE ACCTSPECIAL 2 | !SPL SPLID TRNSTYPE DATE ACCNT NAME CLASS AMOUNT DOCNUM MEMO CLEAR QNTY PRICE INVITEM PAYMETH TAXABLE EXTRA VATCODE VATRATE VATAMOUNT VALADJ SERVICEDATE TAXCODE TAXRATE TAXAMOUNT TAXITEM OTHER2 OTHER3 REIMBEXP ACCTTYPE ACCTSPECIAL ITEMTYPE 3 | !ENDTRNS 4 | TRNS CREDIT CARD 04/11/2012 BofA Credit Card -92.50 N N 04/11/2012 N CCARD 5 | SPL CREDIT CARD 04/11/2012 Travel Expense:Parking 92.50 0 92.50000 0.00 0.00 EXP 6 | ENDTRNS 7 | TRNS CREDIT CARD 04/15/2012 BofA Credit Card -100.00 N N N 04/15/2012 N CCARD 8 | SPL CREDIT CARD 04/15/2012 Ask My Accountant 100.00 0 100.00000 0.00 0.00 EXEXP 9 | ENDTRNS 10 | TRNS CREDIT CARD 04/15/2012 BofA Credit Card -200.00 N N N 04/15/2012 N CCARD 11 | SPL CREDIT CARD 04/15/2012 Uncategorized 200.00 0 200.00000 0.00 0.00 12 | ENDTRNS 13 | 14 | 15 | 16 | 17 | --------------------------------------------------------------------------------