Import QIF file (the most important part of ledger.tcl - http://pdqi.com/ledger.html )
<...> set pc(xaction:fields) {tid tnum tpayee tmemo tsum tdate treco tacct tgroup tsched} set pc(xaction:defs) {{} {} {} {} 0 0 0 0 {} {}} <...> set fp [open $fname r] set insplit 0 foreach j $pc(xaction:fields) k $pc(xaction:defs) { set p($j) $k } set s 0 set cnt 0 while {[set n [gets $fp str]]>0} { set ch [string index $str 0] set rest [string trim [string range $str 1 end]] if {[regexp {^Type} $str]} continue switch $ch { D { if {[catch {set p(tdate) [clock scan $rest]}]} { set p(tdate) [clock seconds] puts $lf "Invalid date, using today: $str" } } T { set p(tsum) $rest regsub -all -- , $p(tsum) {} p(tsum) set p(tsum) [expr $p(tsum)] } C { set p(treco) 1 } P { set p(tpayee) $rest } N { set p(tnum) $rest } M { set p(tmemo) $rest } L { set p(tgroup) $rest } $ { regsub -all -- , $rest {} rest set split(sum:$s) $rest } S { incr s set split(cat:$s) $rest } ^ { set avals {} if {$s} { set accts {} for {set i 1} {$i<=$s} {incr i} { lappend accts $split(cat:$i) lappend avals $split(cat:$i) $split(sum:$i) } } else { set accts [list $p(tgroup)] set avals [list $p(tgroup) $p(tsum)] } set skip 0 foreach i $_(impaccts) { if {[lsearch $accts $i]>=0} { set skip 1 } } if {$skip} { puts $lf "Already imported!: $str" } elseif {$p(tsum) == 0} { puts $lf "Skipping zero sum!: $str" } else { foreach i $accts { if {$_(-catlower)} { set i [string tolower $i] } if {[FieldLookup $__ aclist aname $i] == {}} { $__ newacct aname $i acatagory 1 } } set p(tid) [incr _(-xaction:last)] set p(tgroup) [incr _(-xaction:glast)] set p(tacct) $targacct set rc {} foreach i $pc(xaction:fields) { lappend rc $p($i) } set pt($p(tid)) $rc lappend pg($p(tgroup)) $p(tid) $__ add2field aclist $targacct attl $p(tsum) atransnums 1 foreach {nacct nsum} $avals { if {$_(-catlower)} { set nacct [string tolower $nacct] } set nid2 [incr _(-xaction:last)] lappend pg($p(tgroup)) $nid2 set pt($nid2) $pt($p(tid)) set nsum [expr {-$nsum}] set nacct [FieldLookup $__ aclist aname $nacct] $__ updatetbl xaction $nid2 tacct $nacct tid $nid2 tsum $nsum $__ add2field aclist $nacct attl $nsum atransnums 1 } foreach j $pc(xaction:fields) k $pc(xaction:defs) { set p($j) $k } set s 0 array unset split if {![expr {[incr cnt]%10}]} { set _(status1) "$cnt [mc {transactions imported}]" update } } } } } set _(status1) "$cnt [mc {transactions imported}]" close $fp <...>