qiflib 0.3.0 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: a10f3259aeca5b02f386fd1522fb18b499bec4d3
4
- data.tar.gz: d314812b6e03ad2d47c7f35b337ec4d64e6c1f91
3
+ metadata.gz: 0b8600ed538280b36f811b9b4c603d2fd5e40317
4
+ data.tar.gz: dee8262aea5d8fd3cf9b89e4e5e304ffef147afe
5
5
  SHA512:
6
- metadata.gz: ffb80d8f9efa95fe7497ce6b11a07d1f565a7636a633dbd6308979ec14f2e4d2afa580ccdfa3fc941b5fedf8b56698f0238b99d96c56f0330ba8d1d310411af8
7
- data.tar.gz: 2d46e01f884817457f1ee6537a0174e69d09b75ff1314bc03b21438b07a5b15632a815b153932f35ea1217778ac5dc86a23d20bf62930153386c9050dcbd06be
6
+ metadata.gz: 888f86ad1cb9e7c0140cfa4114456fe254c7a9a9d5465b7fb231f1f64dd5e6014083e2852dcaf47a9f5a5ccf57c0a7a59c627022374795b38890003c194f228b
7
+ data.tar.gz: aa2043e1cbdabf68effdda559a7d7b021375059e17aa3592cd2de4f892eb966c7f7af49b1b999b1d3dc734d97e6a86b3371866f1f0e704c1a0b381821e0e3f0b
data/README.rdoc CHANGED
@@ -1,4 +1,6 @@
1
- == Qiflib version 0.3.0
1
+ == Qiflib
2
+
3
+ version 0.4.0, released 12-14-2013
2
4
 
3
5
  A ruby library for reading and parsing qif files.
4
6
 
@@ -11,6 +13,10 @@ Category-name parsing is also supported.
11
13
  Also includes DDL generation for importing the parsed categories and
12
14
  transactions into a sqlite3 database.
13
15
 
16
+ Version 0.4.0 includes support for iBank version 4.7.5, this version
17
+ exports silightly differently than previous versions.
18
+
19
+
14
20
  == Install
15
21
 
16
22
  gem install qiflib
@@ -132,6 +138,38 @@ transactions into a sqlite3 database.
132
138
  .import private/qiflib_categories.txt categories
133
139
 
134
140
 
141
+ == CSV fields
142
+
143
+ csv field index 0 = id
144
+ csv field index 1 = acct_owner
145
+ csv field index 2 = acct_name
146
+ csv field index 3 = acct_type
147
+ csv field index 4 = date
148
+ csv field index 5 = amount
149
+ csv field index 6 = number
150
+ csv field index 7 = ibank_n
151
+ csv field index 8 = cleared
152
+ csv field index 9 = payee
153
+ csv field index 10 = category
154
+ csv field index 11 = memo
155
+ csv field index 12 = split1_amount
156
+ csv field index 13 = split1_category
157
+ csv field index 14 = split1_memo
158
+ csv field index 15 = split2_amount
159
+ csv field index 16 = split2_category
160
+ csv field index 17 = split2_memo
161
+ csv field index 18 = split3_amount
162
+ csv field index 19 = split3_category
163
+ csv field index 20 = split3_memo
164
+ csv field index 21 = address1
165
+ csv field index 22 = address2
166
+ csv field index 23 = address3
167
+ csv field index 24 = address4
168
+ csv field index 25 = address5
169
+ csv field index 26 = address6
170
+ csv field index 27 = eol_ind
171
+
172
+
135
173
  == Generated shell script
136
174
 
137
175
  # bash-shell script
@@ -383,7 +383,7 @@ section of a qif file.</p>
383
383
  <span class="ruby-keyword">def</span> <span class="ruby-keyword">self</span>.<span class="ruby-identifier">csv_header</span>
384
384
  <span class="ruby-constant">CSV</span>.<span class="ruby-identifier">generate</span> <span class="ruby-keyword">do</span> <span class="ruby-operator">|</span> <span class="ruby-identifier">csv</span> <span class="ruby-operator">|</span>
385
385
  <span class="ruby-identifier">csv</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-constant">Qiflib</span><span class="ruby-operator">::</span><span class="ruby-identifier">csv_transaction_field_names</span>
386
- <span class="ruby-keyword">end</span>
386
+ <span class="ruby-keyword">end</span>
387
387
  <span class="ruby-keyword">end</span></pre>
388
388
  </div><!-- csv_header-source -->
389
389
 
@@ -465,18 +465,18 @@ section of a qif file.</p>
465
465
  <span class="ruby-keyword">if</span> <span class="ruby-identifier">line</span>
466
466
  <span class="ruby-identifier">stripped</span> = <span class="ruby-identifier">line</span>.<span class="ruby-identifier">strip</span>
467
467
  <span class="ruby-keyword">if</span> <span class="ruby-identifier">stripped</span>.<span class="ruby-identifier">size</span> <span class="ruby-operator">&gt;</span> <span class="ruby-value">0</span>
468
- <span class="ruby-comment"># Field Indicator Explanations: </span>
469
- <span class="ruby-comment"># D Date </span>
470
- <span class="ruby-comment"># T Amount </span>
471
- <span class="ruby-comment"># C Cleared status </span>
472
- <span class="ruby-comment"># N Num (check or reference number) </span>
473
- <span class="ruby-comment"># P Payee </span>
474
- <span class="ruby-comment"># M Memo </span>
468
+ <span class="ruby-comment"># Field Indicator Explanations:</span>
469
+ <span class="ruby-comment"># D Date</span>
470
+ <span class="ruby-comment"># T Amount</span>
471
+ <span class="ruby-comment"># C Cleared status</span>
472
+ <span class="ruby-comment"># N Num (check or reference number)</span>
473
+ <span class="ruby-comment"># P Payee</span>
474
+ <span class="ruby-comment"># M Memo</span>
475
475
  <span class="ruby-comment"># A Address (up to five lines; the sixth line is an optional message)</span>
476
- <span class="ruby-comment"># L Category (Category/Subcategory/Transfer/Class) </span>
477
- <span class="ruby-comment"># S Category in split (Category/Transfer/Class) </span>
478
- <span class="ruby-comment"># E Memo in split </span>
479
- <span class="ruby-comment"># $ Dollar amount of split </span>
476
+ <span class="ruby-comment"># L Category (Category/Subcategory/Transfer/Class)</span>
477
+ <span class="ruby-comment"># S Category in split (Category/Transfer/Class)</span>
478
+ <span class="ruby-comment"># E Memo in split</span>
479
+ <span class="ruby-comment"># $ Dollar amount of split</span>
480
480
  <span class="ruby-comment"># ^ End of the entry</span>
481
481
  <span class="ruby-keyword">if</span> (<span class="ruby-identifier">stripped</span>.<span class="ruby-identifier">match</span>(<span class="ruby-regexp">/^D/</span>))
482
482
  <span class="ruby-ivar">@date</span> = <span class="ruby-constant">Qiflib</span><span class="ruby-operator">::</span><span class="ruby-constant">Date</span>.<span class="ruby-identifier">new</span>(<span class="ruby-identifier">line_value</span>(<span class="ruby-identifier">stripped</span>))
@@ -485,22 +485,16 @@ section of a qif file.</p>
485
485
  <span class="ruby-keyword">elsif</span> (<span class="ruby-identifier">stripped</span>.<span class="ruby-identifier">match</span>(<span class="ruby-regexp">/^P/</span>))
486
486
  <span class="ruby-ivar">@payee</span> = <span class="ruby-identifier">line_value</span>(<span class="ruby-identifier">stripped</span>)
487
487
  <span class="ruby-keyword">elsif</span> (<span class="ruby-identifier">stripped</span>.<span class="ruby-identifier">match</span>(<span class="ruby-regexp">/^C/</span>))
488
- <span class="ruby-keyword">if</span> <span class="ruby-identifier">ibank?</span>
489
- <span class="ruby-ivar">@number</span> = <span class="ruby-identifier">line_value</span>(<span class="ruby-identifier">stripped</span>)
490
- <span class="ruby-keyword">else</span>
491
- <span class="ruby-ivar">@cleared</span> = <span class="ruby-identifier">line_value</span>(<span class="ruby-identifier">stripped</span>)
492
- <span class="ruby-keyword">end</span>
488
+ <span class="ruby-ivar">@cleared</span> = <span class="ruby-identifier">line_value</span>(<span class="ruby-identifier">stripped</span>)
493
489
  <span class="ruby-keyword">elsif</span> (<span class="ruby-identifier">stripped</span>.<span class="ruby-identifier">match</span>(<span class="ruby-regexp">/^N/</span>))
494
- <span class="ruby-keyword">if</span> <span class="ruby-identifier">ibank?</span>
495
- <span class="ruby-ivar">@ibank_n</span> = <span class="ruby-identifier">line_value</span>(<span class="ruby-identifier">stripped</span>)
496
- <span class="ruby-keyword">else</span>
497
- <span class="ruby-ivar">@number</span> = <span class="ruby-identifier">line_value</span>(<span class="ruby-identifier">stripped</span>)
498
- <span class="ruby-keyword">end</span>
490
+ <span class="ruby-ivar">@ibank_n</span> = <span class="ruby-identifier">line_value</span>(<span class="ruby-identifier">stripped</span>)
491
+ <span class="ruby-ivar">@number</span> = <span class="ruby-identifier">line_value</span>(<span class="ruby-identifier">stripped</span>)
499
492
  <span class="ruby-keyword">elsif</span> (<span class="ruby-identifier">stripped</span>.<span class="ruby-identifier">match</span>(<span class="ruby-regexp">/^M/</span>))
500
493
  <span class="ruby-ivar">@memo</span> = <span class="ruby-identifier">line_value</span>(<span class="ruby-identifier">stripped</span>)
501
494
  <span class="ruby-keyword">elsif</span> (<span class="ruby-identifier">stripped</span>.<span class="ruby-identifier">match</span>(<span class="ruby-regexp">/^L/</span>))
502
495
  <span class="ruby-ivar">@category</span> = <span class="ruby-identifier">line_value</span>(<span class="ruby-identifier">stripped</span>).<span class="ruby-identifier">downcase</span>
503
496
  <span class="ruby-keyword">elsif</span> (<span class="ruby-identifier">stripped</span>.<span class="ruby-identifier">match</span>(<span class="ruby-regexp">/^S/</span>))
497
+ <span class="ruby-ivar">@category</span> = <span class="ruby-identifier">line_value</span>(<span class="ruby-identifier">stripped</span>).<span class="ruby-identifier">downcase</span> <span class="ruby-keyword">if</span> <span class="ruby-ivar">@category</span>.<span class="ruby-identifier">size</span> <span class="ruby-operator">==</span> <span class="ruby-value">0</span> <span class="ruby-comment"># default to first split category</span>
504
498
  <span class="ruby-identifier">current_split</span>[<span class="ruby-string">&#39;category&#39;</span>] = <span class="ruby-identifier">line_value</span>(<span class="ruby-identifier">stripped</span>).<span class="ruby-identifier">downcase</span>
505
499
  <span class="ruby-keyword">elsif</span> (<span class="ruby-identifier">stripped</span>.<span class="ruby-identifier">match</span>(<span class="ruby-regexp">/^E/</span>))
506
500
  <span class="ruby-identifier">current_split</span>[<span class="ruby-string">&#39;memo&#39;</span>] = <span class="ruby-identifier">line_value</span>(<span class="ruby-identifier">stripped</span>)
@@ -511,8 +505,8 @@ section of a qif file.</p>
511
505
  <span class="ruby-identifier">splits</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-identifier">current_split</span>
512
506
  <span class="ruby-ivar">@curr_split</span> = {}
513
507
  <span class="ruby-keyword">end</span>
514
- <span class="ruby-keyword">end</span>
515
- <span class="ruby-keyword">end</span>
508
+ <span class="ruby-keyword">end</span>
509
+ <span class="ruby-keyword">end</span>
516
510
  <span class="ruby-keyword">end</span></pre>
517
511
  </div><!-- add_line-source -->
518
512
 
@@ -543,7 +537,7 @@ section of a qif file.</p>
543
537
 
544
538
 
545
539
  <div class="method-source-code" id="as_array-source">
546
- <pre><span class="ruby-comment"># File lib/qiflib_transaction.rb, line 107</span>
540
+ <pre><span class="ruby-comment"># File lib/qiflib_transaction.rb, line 101</span>
547
541
  <span class="ruby-keyword">def</span> <span class="ruby-identifier">as_array</span>(<span class="ruby-identifier">idx</span>=<span class="ruby-value">0</span>)
548
542
  <span class="ruby-identifier">array</span> = []
549
543
  <span class="ruby-identifier">array</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-identifier">idx</span> <span class="ruby-operator">+</span> <span class="ruby-value">1</span>
@@ -560,9 +554,9 @@ section of a qif file.</p>
560
554
  <span class="ruby-identifier">array</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-identifier">memo</span>
561
555
  <span class="ruby-value">3</span>.<span class="ruby-identifier">times</span> { <span class="ruby-operator">|</span> <span class="ruby-identifier">i</span> <span class="ruby-operator">|</span>
562
556
  <span class="ruby-keyword">if</span> <span class="ruby-identifier">i</span> <span class="ruby-operator">&lt;</span> <span class="ruby-identifier">splits</span>.<span class="ruby-identifier">size</span>
563
- <span class="ruby-identifier">array</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-identifier">splits</span>[<span class="ruby-identifier">i</span>][<span class="ruby-string">&#39;amount&#39;</span>]
564
- <span class="ruby-identifier">array</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-identifier">splits</span>[<span class="ruby-identifier">i</span>][<span class="ruby-string">&#39;category&#39;</span>]
565
- <span class="ruby-identifier">array</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-identifier">splits</span>[<span class="ruby-identifier">i</span>][<span class="ruby-string">&#39;memo&#39;</span>]
557
+ <span class="ruby-identifier">array</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-identifier">splits</span>[<span class="ruby-identifier">i</span>][<span class="ruby-string">&#39;amount&#39;</span>].<span class="ruby-identifier">to_s</span>
558
+ <span class="ruby-identifier">array</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-identifier">splits</span>[<span class="ruby-identifier">i</span>][<span class="ruby-string">&#39;category&#39;</span>]
559
+ <span class="ruby-identifier">array</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-identifier">splits</span>[<span class="ruby-identifier">i</span>][<span class="ruby-string">&#39;memo&#39;</span>]
566
560
  <span class="ruby-keyword">else</span>
567
561
  <span class="ruby-identifier">array</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-string">&#39;0.0&#39;</span>
568
562
  <span class="ruby-identifier">array</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-string">&#39;&#39;</span>
@@ -608,7 +602,7 @@ section of a qif file.</p>
608
602
 
609
603
 
610
604
  <div class="method-source-code" id="current_split-source">
611
- <pre><span class="ruby-comment"># File lib/qiflib_transaction.rb, line 96</span>
605
+ <pre><span class="ruby-comment"># File lib/qiflib_transaction.rb, line 90</span>
612
606
  <span class="ruby-keyword">def</span> <span class="ruby-identifier">current_split</span>
613
607
  <span class="ruby-ivar">@curr_split</span> = {} <span class="ruby-keyword">if</span> <span class="ruby-ivar">@curr_split</span>.<span class="ruby-identifier">nil?</span>
614
608
  <span class="ruby-ivar">@curr_split</span>
@@ -642,7 +636,7 @@ section of a qif file.</p>
642
636
 
643
637
 
644
638
  <div class="method-source-code" id="ibank-3F-source">
645
- <pre><span class="ruby-comment"># File lib/qiflib_transaction.rb, line 85</span>
639
+ <pre><span class="ruby-comment"># File lib/qiflib_transaction.rb, line 79</span>
646
640
  <span class="ruby-keyword">def</span> <span class="ruby-identifier">ibank?</span>
647
641
  <span class="ruby-ivar">@source_app</span> <span class="ruby-operator">==</span> <span class="ruby-string">&#39;ibank&#39;</span>
648
642
  <span class="ruby-keyword">end</span></pre>
@@ -675,7 +669,7 @@ section of a qif file.</p>
675
669
 
676
670
 
677
671
  <div class="method-source-code" id="line_value-source">
678
- <pre><span class="ruby-comment"># File lib/qiflib_transaction.rb, line 143</span>
672
+ <pre><span class="ruby-comment"># File lib/qiflib_transaction.rb, line 137</span>
679
673
  <span class="ruby-keyword">def</span> <span class="ruby-identifier">line_value</span>(<span class="ruby-identifier">s</span>)
680
674
  <span class="ruby-keyword">return</span> <span class="ruby-string">&#39;&#39;</span> <span class="ruby-keyword">if</span> <span class="ruby-identifier">s</span>.<span class="ruby-identifier">nil?</span> <span class="ruby-operator">||</span> <span class="ruby-identifier">s</span>.<span class="ruby-identifier">size</span> <span class="ruby-operator">&lt;</span> <span class="ruby-value">1</span>
681
675
  <span class="ruby-identifier">s</span>[<span class="ruby-value">1</span>, <span class="ruby-identifier">s</span>.<span class="ruby-identifier">size</span>].<span class="ruby-identifier">strip</span>
@@ -709,11 +703,11 @@ section of a qif file.</p>
709
703
 
710
704
 
711
705
  <div class="method-source-code" id="to_csv-source">
712
- <pre><span class="ruby-comment"># File lib/qiflib_transaction.rb, line 101</span>
706
+ <pre><span class="ruby-comment"># File lib/qiflib_transaction.rb, line 95</span>
713
707
  <span class="ruby-keyword">def</span> <span class="ruby-identifier">to_csv</span>(<span class="ruby-identifier">idx</span>=<span class="ruby-value">0</span>)
714
708
  <span class="ruby-constant">CSV</span>.<span class="ruby-identifier">generate</span> <span class="ruby-keyword">do</span> <span class="ruby-operator">|</span> <span class="ruby-identifier">csv</span> <span class="ruby-operator">|</span>
715
709
  <span class="ruby-identifier">csv</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-identifier">as_array</span>(<span class="ruby-identifier">idx</span>)
716
- <span class="ruby-keyword">end</span>
710
+ <span class="ruby-keyword">end</span>
717
711
  <span class="ruby-keyword">end</span></pre>
718
712
  </div><!-- to_csv-source -->
719
713
 
@@ -744,10 +738,10 @@ section of a qif file.</p>
744
738
 
745
739
 
746
740
  <div class="method-source-code" id="valid-3F-source">
747
- <pre><span class="ruby-comment"># File lib/qiflib_transaction.rb, line 89</span>
741
+ <pre><span class="ruby-comment"># File lib/qiflib_transaction.rb, line 83</span>
748
742
  <span class="ruby-keyword">def</span> <span class="ruby-identifier">valid?</span>
749
743
  <span class="ruby-keyword">return</span> <span class="ruby-keyword">false</span> <span class="ruby-keyword">if</span> <span class="ruby-identifier">date</span>.<span class="ruby-identifier">nil?</span>
750
- <span class="ruby-keyword">return</span> <span class="ruby-keyword">false</span> <span class="ruby-keyword">if</span> <span class="ruby-identifier">date</span>.<span class="ruby-identifier">to_s</span>.<span class="ruby-identifier">size</span> <span class="ruby-operator">&lt;</span> <span class="ruby-value">8</span>
744
+ <span class="ruby-keyword">return</span> <span class="ruby-keyword">false</span> <span class="ruby-keyword">if</span> <span class="ruby-identifier">date</span>.<span class="ruby-identifier">to_s</span>.<span class="ruby-identifier">size</span> <span class="ruby-operator">&lt;</span> <span class="ruby-value">8</span>
751
745
  <span class="ruby-keyword">return</span> <span class="ruby-keyword">false</span> <span class="ruby-keyword">if</span> <span class="ruby-identifier">date</span>.<span class="ruby-identifier">to_s</span> <span class="ruby-operator">==</span> <span class="ruby-string">&#39;0000-00-00&#39;</span>
752
746
  <span class="ruby-keyword">true</span>
753
747
  <span class="ruby-keyword">end</span></pre>
@@ -77,6 +77,8 @@
77
77
 
78
78
  <li ><a href="#method-c-catetory_names_to_delim">::catetory_names_to_delim</a>
79
79
 
80
+ <li ><a href="#method-c-describe_csv_field_array">::describe_csv_field_array</a>
81
+
80
82
  <li ><a href="#method-c-generate_sqlite_ddl">::generate_sqlite_ddl</a>
81
83
 
82
84
  <li ><a href="#method-c-generate_sqlite_load_script">::generate_sqlite_load_script</a>
@@ -200,7 +202,7 @@ given Array of filenames.</p>
200
202
  <span class="ruby-keyword">rescue</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-identifier">err</span>
201
203
  <span class="ruby-identifier">file</span>.<span class="ruby-identifier">close</span> <span class="ruby-keyword">if</span> <span class="ruby-identifier">file</span>
202
204
  <span class="ruby-identifier">puts</span> <span class="ruby-node">&quot;Exception: #{err.class.name} #{err.message} #{err.inspect}&quot;</span>
203
- <span class="ruby-keyword">end</span>
205
+ <span class="ruby-keyword">end</span>
204
206
  }
205
207
  <span class="ruby-keyword">end</span>
206
208
  <span class="ruby-identifier">categories</span>.<span class="ruby-identifier">uniq</span>.<span class="ruby-identifier">sort</span>.<span class="ruby-identifier">each_with_index</span> { <span class="ruby-operator">|</span> <span class="ruby-identifier">name</span>, <span class="ruby-identifier">idx</span> <span class="ruby-operator">|</span>
@@ -265,6 +267,44 @@ within the given Array of filenames.</p>
265
267
  </div><!-- catetory_names_to_delim-method -->
266
268
 
267
269
 
270
+ <div id="method-c-describe_csv_field_array" class="method-detail ">
271
+
272
+ <div class="method-heading">
273
+ <span class="method-name">describe_csv_field_array</span><span
274
+ class="method-args">(array)</span>
275
+
276
+ <span class="method-click-advice">click to toggle source</span>
277
+
278
+ </div>
279
+
280
+
281
+ <div class="method-description">
282
+
283
+ <p>For testing purposes: <a
284
+ href="Util.html#method-c-describe_csv_field_array">::describe_csv_field_array</a></p>
285
+
286
+
287
+
288
+
289
+ <div class="method-source-code" id="describe_csv_field_array-source">
290
+ <pre><span class="ruby-comment"># File lib/qiflib_util.rb, line 178</span>
291
+ <span class="ruby-keyword">def</span> <span class="ruby-keyword">self</span>.<span class="ruby-identifier">describe_csv_field_array</span>(<span class="ruby-identifier">array</span>)
292
+ <span class="ruby-identifier">field_map</span> = <span class="ruby-constant">Qiflib</span><span class="ruby-operator">::</span><span class="ruby-identifier">csv_transaction_field_map</span>
293
+ <span class="ruby-identifier">array</span>.<span class="ruby-identifier">each_with_index</span> { <span class="ruby-operator">|</span> <span class="ruby-identifier">val</span>, <span class="ruby-identifier">idx</span> <span class="ruby-operator">|</span>
294
+ <span class="ruby-identifier">field_name</span> = <span class="ruby-identifier">field_map</span>[<span class="ruby-identifier">idx</span>]
295
+ <span class="ruby-identifier">puts</span> <span class="ruby-node">&quot;array[#{idx}].should == &#39;#{val}&#39; # #{field_name}&quot;</span>
296
+ }
297
+ <span class="ruby-keyword">end</span></pre>
298
+ </div><!-- describe_csv_field_array-source -->
299
+
300
+ </div>
301
+
302
+
303
+
304
+
305
+ </div><!-- describe_csv_field_array-method -->
306
+
307
+
268
308
  <div id="method-c-generate_sqlite_ddl" class="method-detail ">
269
309
 
270
310
  <div class="method-heading">
@@ -290,7 +330,7 @@ and &#39;transactions&#39; tables. The DDL will also import the
290
330
  <span class="ruby-keyword">def</span> <span class="ruby-keyword">self</span>.<span class="ruby-identifier">generate_sqlite_ddl</span>
291
331
  <span class="ruby-identifier">lines</span> = []
292
332
  <span class="ruby-identifier">lines</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-string">&#39;&#39;</span>
293
- <span class="ruby-identifier">lines</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-string">&#39;drop table if exists transactions;&#39;</span>
333
+ <span class="ruby-identifier">lines</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-string">&#39;drop table if exists transactions;&#39;</span>
294
334
  <span class="ruby-identifier">lines</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-string">&#39;drop table if exists categories;&#39;</span>
295
335
  <span class="ruby-identifier">lines</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-string">&#39;&#39;</span>
296
336
  <span class="ruby-identifier">lines</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-string">&#39;create table transactions(&#39;</span>
@@ -326,14 +366,14 @@ and &#39;transactions&#39; tables. The DDL will also import the
326
366
  <span class="ruby-identifier">lines</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-string">&#39;&#39;</span>
327
367
  <span class="ruby-identifier">lines</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-string">&#39;create table categories(&#39;</span>
328
368
  <span class="ruby-identifier">lines</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-string">&#39; id integer,&#39;</span>
329
- <span class="ruby-identifier">lines</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-string">&#39; name varchar(80)&#39;</span>
330
- <span class="ruby-identifier">lines</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-string">&#39;);&#39;</span>
331
- <span class="ruby-identifier">lines</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-string">&#39;&#39;</span>
369
+ <span class="ruby-identifier">lines</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-string">&#39; name varchar(80)&#39;</span>
370
+ <span class="ruby-identifier">lines</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-string">&#39;);&#39;</span>
371
+ <span class="ruby-identifier">lines</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-string">&#39;&#39;</span>
332
372
  <span class="ruby-identifier">lines</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-string">&quot;.separator &#39;^&#39;&quot;</span>
333
373
  <span class="ruby-identifier">lines</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-string">&#39;&#39;</span>
334
- <span class="ruby-identifier">lines</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-string">&#39;.import qiflib_transactions.txt transactions&#39;</span>
335
- <span class="ruby-identifier">lines</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-string">&#39;.import qiflib_categories.txt categories&#39;</span>
336
- <span class="ruby-identifier">lines</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-string">&#39;&#39;</span>
374
+ <span class="ruby-identifier">lines</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-string">&#39;.import private/qiflib_transactions.txt transactions&#39;</span>
375
+ <span class="ruby-identifier">lines</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-string">&#39;.import private/qiflib_categories.txt categories&#39;</span>
376
+ <span class="ruby-identifier">lines</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-string">&#39;&#39;</span>
337
377
  <span class="ruby-identifier">lines</span>
338
378
  <span class="ruby-keyword">end</span></pre>
339
379
  </div><!-- generate_sqlite_ddl-source -->
@@ -359,7 +399,7 @@ and &#39;transactions&#39; tables. The DDL will also import the
359
399
 
360
400
  <div class="method-description">
361
401
 
362
- <p>Return the lines of bash-shell script to load the sqlite3 database via the
402
+ <p>Return the lines of bash-shell script to load the sqlite3 database via the
363
403
  DDL generated in method &#39;generate_sqlite_ddl&#39;.</p>
364
404
 
365
405
 
@@ -372,7 +412,7 @@ DDL generated in method &#39;generate_sqlite_ddl&#39;.</p>
372
412
  <span class="ruby-identifier">lines</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-string">&#39;#!/bin/bash&#39;</span>
373
413
  <span class="ruby-identifier">lines</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-string">&#39;&#39;</span>
374
414
  <span class="ruby-identifier">lines</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-node">&quot;sqlite3 #{db_name} &lt; #{ddl_name}&quot;</span>
375
- <span class="ruby-identifier">lines</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-string">&#39;&#39;</span>
415
+ <span class="ruby-identifier">lines</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-string">&#39;&#39;</span>
376
416
  <span class="ruby-identifier">lines</span>
377
417
  <span class="ruby-keyword">end</span></pre>
378
418
  </div><!-- generate_sqlite_load_script-source -->
@@ -400,7 +440,7 @@ DDL generated in method &#39;generate_sqlite_ddl&#39;.</p>
400
440
 
401
441
  <p>Return lines in CSV format which contain the list of transactions within
402
442
  the given input_list Array. Each Hash within the input_list should contain
403
- keys :owner, :filename, and :source. Specify either the value
443
+ keys :owner, :filename, and :source. Specify either the value
404
444
  Qiflib::SOURCE_IBANK or Qiflib::SOURCE_QUICKEN for :source.</p>
405
445
 
406
446
 
@@ -413,7 +453,7 @@ Qiflib::SOURCE_IBANK or Qiflib::SOURCE_QUICKEN for :source.</p>
413
453
  <span class="ruby-identifier">csv_lines</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-constant">Qiflib</span><span class="ruby-operator">::</span><span class="ruby-constant">Transaction</span>.<span class="ruby-identifier">csv_header</span>
414
454
  <span class="ruby-keyword">if</span> <span class="ruby-identifier">input_list</span>
415
455
  <span class="ruby-identifier">input_list</span>.<span class="ruby-identifier">each</span> { <span class="ruby-operator">|</span> <span class="ruby-identifier">input_hash</span> <span class="ruby-operator">|</span>
416
- <span class="ruby-identifier">owner</span> = <span class="ruby-identifier">input_hash</span>[<span class="ruby-value">:owner</span>]
456
+ <span class="ruby-identifier">owner</span> = <span class="ruby-identifier">input_hash</span>[<span class="ruby-value">:owner</span>]
417
457
  <span class="ruby-identifier">filename</span> = <span class="ruby-identifier">input_hash</span>[<span class="ruby-value">:filename</span>]
418
458
  <span class="ruby-identifier">source</span> = <span class="ruby-identifier">input_hash</span>[<span class="ruby-value">:source</span>]
419
459
  <span class="ruby-identifier">process_file_for_transactions</span>(<span class="ruby-identifier">owner</span>, <span class="ruby-identifier">filename</span>, <span class="ruby-identifier">source</span>, <span class="ruby-identifier">transactions</span>)
@@ -449,7 +489,7 @@ Qiflib::SOURCE_IBANK or Qiflib::SOURCE_QUICKEN for :source.</p>
449
489
 
450
490
  <p>Return lines in ^-delimited format which contain the list of transactions
451
491
  within the given input_list Array. Each Hash within the input_list should
452
- contain keys :owner, :filename, and :source. Specify either the value
492
+ contain keys :owner, :filename, and :source. Specify either the value
453
493
  Qiflib::SOURCE_IBANK or Qiflib::SOURCE_QUICKEN for :source.</p>
454
494
 
455
495
 
data/html/Qiflib.html CHANGED
@@ -74,6 +74,8 @@
74
74
 
75
75
  <li ><a href="#method-c-csv_category_field_names">::csv_category_field_names</a>
76
76
 
77
+ <li ><a href="#method-c-csv_transaction_field_map">::csv_transaction_field_map</a>
78
+
77
79
  <li ><a href="#method-c-csv_transaction_field_names">::csv_transaction_field_names</a>
78
80
 
79
81
  </ul>
@@ -215,6 +217,43 @@ the csv and delimited files.</p>
215
217
  </div><!-- csv_category_field_names-method -->
216
218
 
217
219
 
220
+ <div id="method-c-csv_transaction_field_map" class="method-detail ">
221
+
222
+ <div class="method-heading">
223
+ <span class="method-name">csv_transaction_field_map</span><span
224
+ class="method-args">()</span>
225
+
226
+ <span class="method-click-advice">click to toggle source</span>
227
+
228
+ </div>
229
+
230
+
231
+ <div class="method-description">
232
+
233
+
234
+
235
+
236
+
237
+
238
+ <div class="method-source-code" id="csv_transaction_field_map-source">
239
+ <pre><span class="ruby-comment"># File lib/qiflib_constants.rb, line 51</span>
240
+ <span class="ruby-keyword">def</span> <span class="ruby-keyword">self</span>.<span class="ruby-identifier">csv_transaction_field_map</span>
241
+ <span class="ruby-identifier">hash</span> = {}
242
+ <span class="ruby-constant">Qiflib</span>.<span class="ruby-identifier">csv_transaction_field_names</span>.<span class="ruby-identifier">each_with_index</span> { <span class="ruby-operator">|</span> <span class="ruby-identifier">field</span>, <span class="ruby-identifier">index</span> <span class="ruby-operator">|</span>
243
+ <span class="ruby-identifier">hash</span>[<span class="ruby-identifier">index</span>] = <span class="ruby-identifier">field</span>
244
+ }
245
+ <span class="ruby-identifier">hash</span>
246
+ <span class="ruby-keyword">end</span></pre>
247
+ </div><!-- csv_transaction_field_map-source -->
248
+
249
+ </div>
250
+
251
+
252
+
253
+
254
+ </div><!-- csv_transaction_field_map-method -->
255
+
256
+
218
257
  <div id="method-c-csv_transaction_field_names" class="method-detail ">
219
258
 
220
259
  <div class="method-heading">
@@ -52,7 +52,8 @@
52
52
  <li><a href="#label-Install">Install</a>
53
53
  <li><a href="#label-Synopsis">Synopsis</a>
54
54
  <li><a href="#label-Generated+DDL">Generated DDL</a>
55
- <li><a href="#label-Generated+shell+script+">Generated shell script </a>
55
+ <li><a href="#label-CSV+fields">CSV fields</a>
56
+ <li><a href="#label-Generated+shell+script">Generated shell script</a>
56
57
  <li><a href="#label-Copyright+and+License">Copyright and License</a>
57
58
  </ul>
58
59
  </nav>
@@ -97,6 +98,8 @@
97
98
 
98
99
  <h2 id="label-Qiflib"><a href="Qiflib.html">Qiflib</a><span><a href="#label-Qiflib">&para;</a> <a href="#documentation">&uarr;</a></span></h2>
99
100
 
101
+ <p>version 0.4.0, released 12-14-2013</p>
102
+
100
103
  <p>A ruby library for reading and parsing qif files.</p>
101
104
 
102
105
  <p>Transaction parsing is supported, including address fields, and up to three
@@ -105,9 +108,12 @@ each transaction.</p>
105
108
 
106
109
  <p>Category-name parsing is also supported.</p>
107
110
 
108
- <p>Also includes DDL generation for importing the parsed categories and
111
+ <p>Also includes DDL generation for importing the parsed categories and
109
112
  transactions into a sqlite3 database.</p>
110
113
 
114
+ <p>Version 0.4.0 includes support for iBank version 4.7.5, this version
115
+ exports silightly differently than previous versions.</p>
116
+
111
117
  <h2 id="label-Install">Install<span><a href="#label-Install">&para;</a> <a href="#documentation">&uarr;</a></span></h2>
112
118
 
113
119
  <pre>gem install qiflib</pre>
@@ -120,24 +126,24 @@ transactions into a sqlite3 database.</p>
120
126
  <span class="ruby-comment"># Qiflib::SOURCE_QUICKEN as the :source.</span>
121
127
 
122
128
  <span class="ruby-identifier">input_list</span> = []
123
- <span class="ruby-identifier">input_list</span> <span class="ruby-operator">&lt;&lt;</span> {
129
+ <span class="ruby-identifier">input_list</span> <span class="ruby-operator">&lt;&lt;</span> {
124
130
  :<span class="ruby-identifier">owner</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-string">&#39;Chris&#39;</span>,
125
131
  :<span class="ruby-identifier">filename</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-string">&#39;data/ibank_cj.qif&#39;</span>,
126
132
  :<span class="ruby-identifier">source</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-constant">Qiflib</span><span class="ruby-operator">::</span><span class="ruby-constant">SOURCE_IBANK</span> }
127
- <span class="ruby-identifier">input_list</span> <span class="ruby-operator">&lt;&lt;</span> {
133
+ <span class="ruby-identifier">input_list</span> <span class="ruby-operator">&lt;&lt;</span> {
128
134
  :<span class="ruby-identifier">owner</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-string">&#39;Teri&#39;</span>,
129
135
  :<span class="ruby-identifier">filename</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-string">&#39;data/ibank_tj.qif&#39;</span>,
130
136
  :<span class="ruby-identifier">source</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-constant">Qiflib</span><span class="ruby-operator">::</span><span class="ruby-constant">SOURCE_QUICKEN</span> }
131
137
 
132
- <span class="ruby-identifier">csv_lines</span> = <span class="ruby-constant">Qiflib</span><span class="ruby-operator">::</span><span class="ruby-constant">Util</span>.<span class="ruby-identifier">transactions_to_csv</span>(<span class="ruby-identifier">input_list</span>)
138
+ <span class="ruby-identifier">csv_lines</span> = <span class="ruby-constant">Qiflib</span><span class="ruby-operator">::</span><span class="ruby-constant">Util</span>.<span class="ruby-identifier">transactions_to_csv</span>(<span class="ruby-identifier">input_list</span>)
133
139
 
134
140
  <span class="ruby-operator">...</span> <span class="ruby-identifier">write</span> <span class="ruby-identifier">csv_lines</span> <span class="ruby-identifier">to</span> <span class="ruby-identifier">a</span> <span class="ruby-identifier">file</span>
135
141
 
136
- <span class="ruby-comment"># Parse the transactions from one or more files to ^-delimited text. </span>
142
+ <span class="ruby-comment"># Parse the transactions from one or more files to ^-delimited text.</span>
137
143
  <span class="ruby-comment"># The text lines are suitable for loading to sqlite3.</span>
138
144
 
139
145
  <span class="ruby-identifier">input_list</span> = []
140
- <span class="ruby-identifier">input_list</span> <span class="ruby-operator">&lt;&lt;</span> {
146
+ <span class="ruby-identifier">input_list</span> <span class="ruby-operator">&lt;&lt;</span> {
141
147
  :<span class="ruby-identifier">owner</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-string">&#39;Chris&#39;</span>,
142
148
  :<span class="ruby-identifier">filename</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-string">&#39;data/ibank_cj.qif&#39;</span>,
143
149
  :<span class="ruby-identifier">source</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-constant">Qiflib</span><span class="ruby-operator">::</span><span class="ruby-constant">SOURCE_IBANK</span> }
@@ -151,26 +157,26 @@ transactions into a sqlite3 database.</p>
151
157
  <span class="ruby-identifier">input_list</span> = [ <span class="ruby-string">&#39;data/ibank_cj.qif&#39;</span> ]
152
158
  <span class="ruby-identifier">csv_lines</span> = <span class="ruby-constant">Qiflib</span><span class="ruby-operator">::</span><span class="ruby-constant">Util</span>.<span class="ruby-identifier">catetory_names_to_csv</span>(<span class="ruby-identifier">input_list</span>)
153
159
 
154
- <span class="ruby-operator">...</span> <span class="ruby-identifier">write</span> <span class="ruby-identifier">csv_lines</span> <span class="ruby-identifier">to</span> <span class="ruby-identifier">a</span> <span class="ruby-identifier">file</span>
160
+ <span class="ruby-operator">...</span> <span class="ruby-identifier">write</span> <span class="ruby-identifier">csv_lines</span> <span class="ruby-identifier">to</span> <span class="ruby-identifier">a</span> <span class="ruby-identifier">file</span>
155
161
 
156
- <span class="ruby-comment"># Parse the categories from one or more files to ^-delimited text. </span>
157
- <span class="ruby-comment"># The text lines are suitable for loading to sqlite3. </span>
162
+ <span class="ruby-comment"># Parse the categories from one or more files to ^-delimited text.</span>
163
+ <span class="ruby-comment"># The text lines are suitable for loading to sqlite3.</span>
158
164
 
159
165
  <span class="ruby-identifier">input_list</span> = [ <span class="ruby-string">&#39;data/ibank_cj.qif&#39;</span> ]
160
166
  <span class="ruby-identifier">delim_lines</span> = <span class="ruby-constant">Qiflib</span><span class="ruby-operator">::</span><span class="ruby-constant">Util</span>.<span class="ruby-identifier">catetory_names_to_delim</span>(<span class="ruby-identifier">input_list</span>)
161
167
 
162
- <span class="ruby-operator">...</span> <span class="ruby-identifier">write</span> <span class="ruby-identifier">delim_lines</span> <span class="ruby-identifier">to</span> <span class="ruby-identifier">a</span> <span class="ruby-identifier">file</span>
168
+ <span class="ruby-operator">...</span> <span class="ruby-identifier">write</span> <span class="ruby-identifier">delim_lines</span> <span class="ruby-identifier">to</span> <span class="ruby-identifier">a</span> <span class="ruby-identifier">file</span>
163
169
 
164
170
  <span class="ruby-comment"># Generate the DDL for a sqlite3 database with categories and transactions tables.</span>
165
171
 
166
172
  <span class="ruby-identifier">ddl_lines</span> = <span class="ruby-constant">Qiflib</span><span class="ruby-operator">::</span><span class="ruby-constant">Util</span>.<span class="ruby-identifier">generate_sqlite_ddl</span>
167
173
 
168
- <span class="ruby-operator">...</span> <span class="ruby-identifier">write</span> <span class="ruby-identifier">ddl_lines</span> <span class="ruby-identifier">to</span> <span class="ruby-identifier">a</span> <span class="ruby-identifier">file</span>; <span class="ruby-identifier">use</span> <span class="ruby-identifier">it</span> <span class="ruby-keyword">in</span> <span class="ruby-identifier">the</span> <span class="ruby-identifier">following</span> <span class="ruby-identifier">bash</span><span class="ruby-operator">-</span><span class="ruby-identifier">shell</span> <span class="ruby-identifier">script</span>
174
+ <span class="ruby-operator">...</span> <span class="ruby-identifier">write</span> <span class="ruby-identifier">ddl_lines</span> <span class="ruby-identifier">to</span> <span class="ruby-identifier">a</span> <span class="ruby-identifier">file</span>; <span class="ruby-identifier">use</span> <span class="ruby-identifier">it</span> <span class="ruby-keyword">in</span> <span class="ruby-identifier">the</span> <span class="ruby-identifier">following</span> <span class="ruby-identifier">bash</span><span class="ruby-operator">-</span><span class="ruby-identifier">shell</span> <span class="ruby-identifier">script</span>
169
175
 
170
- <span class="ruby-comment"># Generate a bash-shell script to load the categories and transactions </span>
176
+ <span class="ruby-comment"># Generate a bash-shell script to load the categories and transactions</span>
171
177
  <span class="ruby-comment"># delimited files into a sqlite3 database, using the above DDL.</span>
172
178
 
173
- <span class="ruby-identifier">sh_lines</span> = <span class="ruby-constant">Qiflib</span><span class="ruby-operator">::</span><span class="ruby-constant">Util</span>.<span class="ruby-identifier">generate_sqlite_load_script</span>
179
+ <span class="ruby-identifier">sh_lines</span> = <span class="ruby-constant">Qiflib</span><span class="ruby-operator">::</span><span class="ruby-constant">Util</span>.<span class="ruby-identifier">generate_sqlite_load_script</span>
174
180
 
175
181
  <span class="ruby-operator">...</span> <span class="ruby-identifier">write</span> <span class="ruby-identifier">sh_lines</span> <span class="ruby-identifier">to</span> <span class="ruby-identifier">a</span> <span class="ruby-identifier">file</span>; <span class="ruby-identifier">chmod</span> <span class="ruby-value">744</span>; <span class="ruby-identifier">run</span> <span class="ruby-identifier">it</span>.
176
182
  </pre>
@@ -220,12 +226,43 @@ create table categories(
220
226
 
221
227
  .separator &#39;^&#39;
222
228
 
223
- .import qiflib_transactions.txt transactions
224
- .import qiflib_categories.txt categories</pre>
225
-
226
- <h2 id="label-Generated+shell+script+">Generated shell script <span><a href="#label-Generated+shell+script+">&para;</a> <a href="#documentation">&uarr;</a></span></h2>
227
-
228
- <pre># bash-shell script
229
+ .import private/qiflib_transactions.txt transactions
230
+ .import private/qiflib_categories.txt categories</pre>
231
+
232
+ <h2 id="label-CSV+fields">CSV fields<span><a href="#label-CSV+fields">&para;</a> <a href="#documentation">&uarr;</a></span></h2>
233
+
234
+ <pre>csv field index 0 = id
235
+ csv field index 1 = acct_owner
236
+ csv field index 2 = acct_name
237
+ csv field index 3 = acct_type
238
+ csv field index 4 = date
239
+ csv field index 5 = amount
240
+ csv field index 6 = number
241
+ csv field index 7 = ibank_n
242
+ csv field index 8 = cleared
243
+ csv field index 9 = payee
244
+ csv field index 10 = category
245
+ csv field index 11 = memo
246
+ csv field index 12 = split1_amount
247
+ csv field index 13 = split1_category
248
+ csv field index 14 = split1_memo
249
+ csv field index 15 = split2_amount
250
+ csv field index 16 = split2_category
251
+ csv field index 17 = split2_memo
252
+ csv field index 18 = split3_amount
253
+ csv field index 19 = split3_category
254
+ csv field index 20 = split3_memo
255
+ csv field index 21 = address1
256
+ csv field index 22 = address2
257
+ csv field index 23 = address3
258
+ csv field index 24 = address4
259
+ csv field index 25 = address5
260
+ csv field index 26 = address6
261
+ csv field index 27 = eol_ind</pre>
262
+
263
+ <h2 id="label-Generated+shell+script">Generated shell script<span><a href="#label-Generated+shell+script">&para;</a> <a href="#documentation">&uarr;</a></span></h2>
264
+
265
+ <pre># bash-shell script
229
266
 
230
267
  #!/bin/bash
231
268
 
data/html/index.html CHANGED
@@ -81,6 +81,8 @@
81
81
 
82
82
  <h2 id="label-Qiflib"><a href="Qiflib.html">Qiflib</a><span><a href="#label-Qiflib">&para;</a> <a href="#documentation">&uarr;</a></span></h2>
83
83
 
84
+ <p>version 0.4.0, released 12-14-2013</p>
85
+
84
86
  <p>A ruby library for reading and parsing qif files.</p>
85
87
 
86
88
  <p>Transaction parsing is supported, including address fields, and up to three
@@ -89,9 +91,12 @@ each transaction.</p>
89
91
 
90
92
  <p>Category-name parsing is also supported.</p>
91
93
 
92
- <p>Also includes DDL generation for importing the parsed categories and
94
+ <p>Also includes DDL generation for importing the parsed categories and
93
95
  transactions into a sqlite3 database.</p>
94
96
 
97
+ <p>Version 0.4.0 includes support for iBank version 4.7.5, this version
98
+ exports silightly differently than previous versions.</p>
99
+
95
100
  <h2 id="label-Install">Install<span><a href="#label-Install">&para;</a> <a href="#documentation">&uarr;</a></span></h2>
96
101
 
97
102
  <pre>gem install qiflib</pre>
@@ -104,24 +109,24 @@ transactions into a sqlite3 database.</p>
104
109
  <span class="ruby-comment"># Qiflib::SOURCE_QUICKEN as the :source.</span>
105
110
 
106
111
  <span class="ruby-identifier">input_list</span> = []
107
- <span class="ruby-identifier">input_list</span> <span class="ruby-operator">&lt;&lt;</span> {
112
+ <span class="ruby-identifier">input_list</span> <span class="ruby-operator">&lt;&lt;</span> {
108
113
  :<span class="ruby-identifier">owner</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-string">&#39;Chris&#39;</span>,
109
114
  :<span class="ruby-identifier">filename</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-string">&#39;data/ibank_cj.qif&#39;</span>,
110
115
  :<span class="ruby-identifier">source</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-constant">Qiflib</span><span class="ruby-operator">::</span><span class="ruby-constant">SOURCE_IBANK</span> }
111
- <span class="ruby-identifier">input_list</span> <span class="ruby-operator">&lt;&lt;</span> {
116
+ <span class="ruby-identifier">input_list</span> <span class="ruby-operator">&lt;&lt;</span> {
112
117
  :<span class="ruby-identifier">owner</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-string">&#39;Teri&#39;</span>,
113
118
  :<span class="ruby-identifier">filename</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-string">&#39;data/ibank_tj.qif&#39;</span>,
114
119
  :<span class="ruby-identifier">source</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-constant">Qiflib</span><span class="ruby-operator">::</span><span class="ruby-constant">SOURCE_QUICKEN</span> }
115
120
 
116
- <span class="ruby-identifier">csv_lines</span> = <span class="ruby-constant">Qiflib</span><span class="ruby-operator">::</span><span class="ruby-constant">Util</span>.<span class="ruby-identifier">transactions_to_csv</span>(<span class="ruby-identifier">input_list</span>)
121
+ <span class="ruby-identifier">csv_lines</span> = <span class="ruby-constant">Qiflib</span><span class="ruby-operator">::</span><span class="ruby-constant">Util</span>.<span class="ruby-identifier">transactions_to_csv</span>(<span class="ruby-identifier">input_list</span>)
117
122
 
118
123
  <span class="ruby-operator">...</span> <span class="ruby-identifier">write</span> <span class="ruby-identifier">csv_lines</span> <span class="ruby-identifier">to</span> <span class="ruby-identifier">a</span> <span class="ruby-identifier">file</span>
119
124
 
120
- <span class="ruby-comment"># Parse the transactions from one or more files to ^-delimited text. </span>
125
+ <span class="ruby-comment"># Parse the transactions from one or more files to ^-delimited text.</span>
121
126
  <span class="ruby-comment"># The text lines are suitable for loading to sqlite3.</span>
122
127
 
123
128
  <span class="ruby-identifier">input_list</span> = []
124
- <span class="ruby-identifier">input_list</span> <span class="ruby-operator">&lt;&lt;</span> {
129
+ <span class="ruby-identifier">input_list</span> <span class="ruby-operator">&lt;&lt;</span> {
125
130
  :<span class="ruby-identifier">owner</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-string">&#39;Chris&#39;</span>,
126
131
  :<span class="ruby-identifier">filename</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-string">&#39;data/ibank_cj.qif&#39;</span>,
127
132
  :<span class="ruby-identifier">source</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-constant">Qiflib</span><span class="ruby-operator">::</span><span class="ruby-constant">SOURCE_IBANK</span> }
@@ -135,26 +140,26 @@ transactions into a sqlite3 database.</p>
135
140
  <span class="ruby-identifier">input_list</span> = [ <span class="ruby-string">&#39;data/ibank_cj.qif&#39;</span> ]
136
141
  <span class="ruby-identifier">csv_lines</span> = <span class="ruby-constant">Qiflib</span><span class="ruby-operator">::</span><span class="ruby-constant">Util</span>.<span class="ruby-identifier">catetory_names_to_csv</span>(<span class="ruby-identifier">input_list</span>)
137
142
 
138
- <span class="ruby-operator">...</span> <span class="ruby-identifier">write</span> <span class="ruby-identifier">csv_lines</span> <span class="ruby-identifier">to</span> <span class="ruby-identifier">a</span> <span class="ruby-identifier">file</span>
143
+ <span class="ruby-operator">...</span> <span class="ruby-identifier">write</span> <span class="ruby-identifier">csv_lines</span> <span class="ruby-identifier">to</span> <span class="ruby-identifier">a</span> <span class="ruby-identifier">file</span>
139
144
 
140
- <span class="ruby-comment"># Parse the categories from one or more files to ^-delimited text. </span>
141
- <span class="ruby-comment"># The text lines are suitable for loading to sqlite3. </span>
145
+ <span class="ruby-comment"># Parse the categories from one or more files to ^-delimited text.</span>
146
+ <span class="ruby-comment"># The text lines are suitable for loading to sqlite3.</span>
142
147
 
143
148
  <span class="ruby-identifier">input_list</span> = [ <span class="ruby-string">&#39;data/ibank_cj.qif&#39;</span> ]
144
149
  <span class="ruby-identifier">delim_lines</span> = <span class="ruby-constant">Qiflib</span><span class="ruby-operator">::</span><span class="ruby-constant">Util</span>.<span class="ruby-identifier">catetory_names_to_delim</span>(<span class="ruby-identifier">input_list</span>)
145
150
 
146
- <span class="ruby-operator">...</span> <span class="ruby-identifier">write</span> <span class="ruby-identifier">delim_lines</span> <span class="ruby-identifier">to</span> <span class="ruby-identifier">a</span> <span class="ruby-identifier">file</span>
151
+ <span class="ruby-operator">...</span> <span class="ruby-identifier">write</span> <span class="ruby-identifier">delim_lines</span> <span class="ruby-identifier">to</span> <span class="ruby-identifier">a</span> <span class="ruby-identifier">file</span>
147
152
 
148
153
  <span class="ruby-comment"># Generate the DDL for a sqlite3 database with categories and transactions tables.</span>
149
154
 
150
155
  <span class="ruby-identifier">ddl_lines</span> = <span class="ruby-constant">Qiflib</span><span class="ruby-operator">::</span><span class="ruby-constant">Util</span>.<span class="ruby-identifier">generate_sqlite_ddl</span>
151
156
 
152
- <span class="ruby-operator">...</span> <span class="ruby-identifier">write</span> <span class="ruby-identifier">ddl_lines</span> <span class="ruby-identifier">to</span> <span class="ruby-identifier">a</span> <span class="ruby-identifier">file</span>; <span class="ruby-identifier">use</span> <span class="ruby-identifier">it</span> <span class="ruby-keyword">in</span> <span class="ruby-identifier">the</span> <span class="ruby-identifier">following</span> <span class="ruby-identifier">bash</span><span class="ruby-operator">-</span><span class="ruby-identifier">shell</span> <span class="ruby-identifier">script</span>
157
+ <span class="ruby-operator">...</span> <span class="ruby-identifier">write</span> <span class="ruby-identifier">ddl_lines</span> <span class="ruby-identifier">to</span> <span class="ruby-identifier">a</span> <span class="ruby-identifier">file</span>; <span class="ruby-identifier">use</span> <span class="ruby-identifier">it</span> <span class="ruby-keyword">in</span> <span class="ruby-identifier">the</span> <span class="ruby-identifier">following</span> <span class="ruby-identifier">bash</span><span class="ruby-operator">-</span><span class="ruby-identifier">shell</span> <span class="ruby-identifier">script</span>
153
158
 
154
- <span class="ruby-comment"># Generate a bash-shell script to load the categories and transactions </span>
159
+ <span class="ruby-comment"># Generate a bash-shell script to load the categories and transactions</span>
155
160
  <span class="ruby-comment"># delimited files into a sqlite3 database, using the above DDL.</span>
156
161
 
157
- <span class="ruby-identifier">sh_lines</span> = <span class="ruby-constant">Qiflib</span><span class="ruby-operator">::</span><span class="ruby-constant">Util</span>.<span class="ruby-identifier">generate_sqlite_load_script</span>
162
+ <span class="ruby-identifier">sh_lines</span> = <span class="ruby-constant">Qiflib</span><span class="ruby-operator">::</span><span class="ruby-constant">Util</span>.<span class="ruby-identifier">generate_sqlite_load_script</span>
158
163
 
159
164
  <span class="ruby-operator">...</span> <span class="ruby-identifier">write</span> <span class="ruby-identifier">sh_lines</span> <span class="ruby-identifier">to</span> <span class="ruby-identifier">a</span> <span class="ruby-identifier">file</span>; <span class="ruby-identifier">chmod</span> <span class="ruby-value">744</span>; <span class="ruby-identifier">run</span> <span class="ruby-identifier">it</span>.
160
165
  </pre>
@@ -204,12 +209,43 @@ create table categories(
204
209
 
205
210
  .separator &#39;^&#39;
206
211
 
207
- .import qiflib_transactions.txt transactions
208
- .import qiflib_categories.txt categories</pre>
209
-
210
- <h2 id="label-Generated+shell+script+">Generated shell script <span><a href="#label-Generated+shell+script+">&para;</a> <a href="#documentation">&uarr;</a></span></h2>
211
-
212
- <pre># bash-shell script
212
+ .import private/qiflib_transactions.txt transactions
213
+ .import private/qiflib_categories.txt categories</pre>
214
+
215
+ <h2 id="label-CSV+fields">CSV fields<span><a href="#label-CSV+fields">&para;</a> <a href="#documentation">&uarr;</a></span></h2>
216
+
217
+ <pre>csv field index 0 = id
218
+ csv field index 1 = acct_owner
219
+ csv field index 2 = acct_name
220
+ csv field index 3 = acct_type
221
+ csv field index 4 = date
222
+ csv field index 5 = amount
223
+ csv field index 6 = number
224
+ csv field index 7 = ibank_n
225
+ csv field index 8 = cleared
226
+ csv field index 9 = payee
227
+ csv field index 10 = category
228
+ csv field index 11 = memo
229
+ csv field index 12 = split1_amount
230
+ csv field index 13 = split1_category
231
+ csv field index 14 = split1_memo
232
+ csv field index 15 = split2_amount
233
+ csv field index 16 = split2_category
234
+ csv field index 17 = split2_memo
235
+ csv field index 18 = split3_amount
236
+ csv field index 19 = split3_category
237
+ csv field index 20 = split3_memo
238
+ csv field index 21 = address1
239
+ csv field index 22 = address2
240
+ csv field index 23 = address3
241
+ csv field index 24 = address4
242
+ csv field index 25 = address5
243
+ csv field index 26 = address6
244
+ csv field index 27 = eol_ind</pre>
245
+
246
+ <h2 id="label-Generated+shell+script">Generated shell script<span><a href="#label-Generated+shell+script">&para;</a> <a href="#documentation">&uarr;</a></span></h2>
247
+
248
+ <pre># bash-shell script
213
249
 
214
250
  #!/bin/bash
215
251
 
@@ -34,7 +34,8 @@
34
34
  <li><a href="README_rdoc.html#label-Install">Install</a>
35
35
  <li><a href="README_rdoc.html#label-Synopsis">Synopsis</a>
36
36
  <li><a href="README_rdoc.html#label-Generated+DDL">Generated DDL</a>
37
- <li><a href="README_rdoc.html#label-Generated+shell+script+">Generated shell script </a>
37
+ <li><a href="README_rdoc.html#label-CSV+fields">CSV fields</a>
38
+ <li><a href="README_rdoc.html#label-Generated+shell+script">Generated shell script</a>
38
39
  <li><a href="README_rdoc.html#label-Copyright+and+License">Copyright and License</a>
39
40
  </ul>
40
41
  </li>
@@ -77,18 +78,22 @@
77
78
 
78
79
  <li class="method"><a href="Qiflib/Transaction.html#method-c-csv_header">::csv_header &mdash; Qiflib::Transaction</a>
79
80
 
81
+ <li class="method"><a href="Qiflib.html#method-c-csv_transaction_field_map">::csv_transaction_field_map &mdash; Qiflib</a>
82
+
80
83
  <li class="method"><a href="Qiflib.html#method-c-csv_transaction_field_names">::csv_transaction_field_names &mdash; Qiflib</a>
81
84
 
85
+ <li class="method"><a href="Qiflib/Util.html#method-c-describe_csv_field_array">::describe_csv_field_array &mdash; Qiflib::Util</a>
86
+
82
87
  <li class="method"><a href="Qiflib/Util.html#method-c-generate_sqlite_ddl">::generate_sqlite_ddl &mdash; Qiflib::Util</a>
83
88
 
84
89
  <li class="method"><a href="Qiflib/Util.html#method-c-generate_sqlite_load_script">::generate_sqlite_load_script &mdash; Qiflib::Util</a>
85
90
 
91
+ <li class="method"><a href="Qiflib/Money.html#method-c-new">::new &mdash; Qiflib::Money</a>
92
+
86
93
  <li class="method"><a href="Qiflib/Transaction.html#method-c-new">::new &mdash; Qiflib::Transaction</a>
87
94
 
88
95
  <li class="method"><a href="Qiflib/Category.html#method-c-new">::new &mdash; Qiflib::Category</a>
89
96
 
90
- <li class="method"><a href="Qiflib/Money.html#method-c-new">::new &mdash; Qiflib::Money</a>
91
-
92
97
  <li class="method"><a href="Qiflib/Date.html#method-c-new">::new &mdash; Qiflib::Date</a>
93
98
 
94
99
  <li class="method"><a href="Qiflib/Util.html#method-c-transactions_to_csv">::transactions_to_csv &mdash; Qiflib::Util</a>
@@ -97,10 +102,10 @@
97
102
 
98
103
  <li class="method"><a href="Qiflib/Transaction.html#method-i-add_line">#add_line &mdash; Qiflib::Transaction</a>
99
104
 
100
- <li class="method"><a href="Qiflib/Category.html#method-i-as_array">#as_array &mdash; Qiflib::Category</a>
101
-
102
105
  <li class="method"><a href="Qiflib/Transaction.html#method-i-as_array">#as_array &mdash; Qiflib::Transaction</a>
103
106
 
107
+ <li class="method"><a href="Qiflib/Category.html#method-i-as_array">#as_array &mdash; Qiflib::Category</a>
108
+
104
109
  <li class="method"><a href="Qiflib/Money.html#method-i-cents">#cents &mdash; Qiflib::Money</a>
105
110
 
106
111
  <li class="method"><a href="Qiflib/Transaction.html#method-i-current_split">#current_split &mdash; Qiflib::Transaction</a>
@@ -113,10 +118,10 @@
113
118
 
114
119
  <li class="method"><a href="Qiflib/Transaction.html#method-i-to_csv">#to_csv &mdash; Qiflib::Transaction</a>
115
120
 
116
- <li class="method"><a href="Qiflib/Date.html#method-i-to_s">#to_s &mdash; Qiflib::Date</a>
117
-
118
121
  <li class="method"><a href="Qiflib/Money.html#method-i-to_s">#to_s &mdash; Qiflib::Money</a>
119
122
 
123
+ <li class="method"><a href="Qiflib/Date.html#method-i-to_s">#to_s &mdash; Qiflib::Date</a>
124
+
120
125
  <li class="method"><a href="Qiflib/Transaction.html#method-i-valid-3F">#valid? &mdash; Qiflib::Transaction</a>
121
126
 
122
127
  </ul>
@@ -4,8 +4,8 @@
4
4
 
5
5
  module Qiflib
6
6
 
7
- VERSION = '0.3.0'
8
- DATE = '2013-08-25'
7
+ VERSION = '0.4.0'
8
+ DATE = '2013-12-14'
9
9
  AUTHOR = 'Chris Joakim'
10
10
  EMAIL = 'cjoakim@bellsouth.net'
11
11
  SOURCE_QUICKEN = 'quicken'
@@ -48,4 +48,12 @@ module Qiflib
48
48
  )
49
49
  end
50
50
 
51
+ def self.csv_transaction_field_map
52
+ hash = {}
53
+ Qiflib.csv_transaction_field_names.each_with_index { | field, index |
54
+ hash[index] = field
55
+ }
56
+ hash
57
+ end
58
+
51
59
  end
@@ -3,20 +3,20 @@ module Qiflib
3
3
 
4
4
  # Instances of this class represent a transaction parsed within an
5
5
  # !Account section of a qif file.
6
-
6
+
7
7
  class Transaction
8
8
 
9
9
  attr_accessor :id # computed field
10
10
  attr_accessor :acct_owner, :acct_name, :acct_type, :source_app # constructor arg fields
11
- attr_reader :date, :amount, :cleared, :category, :number, :payee, :memo # data fields
12
- attr_reader :splits, :address, :ibank_n
13
-
11
+ attr_reader :date, :amount, :cleared, :category, :number, :payee, :memo # data fields
12
+ attr_reader :splits, :address, :ibank_n
13
+
14
14
  def self.csv_header
15
15
  CSV.generate do | csv |
16
16
  csv << Qiflib::csv_transaction_field_names
17
- end
18
- end
19
-
17
+ end
18
+ end
19
+
20
20
  def initialize(acct_owner=nil, acct_name=nil, acct_type=nil, source_app='quicken')
21
21
  if acct_owner
22
22
  @acct_owner = "#{acct_owner}".downcase
@@ -27,23 +27,23 @@ module Qiflib
27
27
  @splits, @curr_split, @address, @ibank_n = [], {}, [], ''
28
28
  end
29
29
  end
30
-
30
+
31
31
  def add_line(line)
32
32
  if line
33
33
  stripped = line.strip
34
34
  if stripped.size > 0
35
- # Field Indicator Explanations:
36
- # D Date
37
- # T Amount
38
- # C Cleared status
39
- # N Num (check or reference number)
40
- # P Payee
41
- # M Memo
35
+ # Field Indicator Explanations:
36
+ # D Date
37
+ # T Amount
38
+ # C Cleared status
39
+ # N Num (check or reference number)
40
+ # P Payee
41
+ # M Memo
42
42
  # A Address (up to five lines; the sixth line is an optional message)
43
- # L Category (Category/Subcategory/Transfer/Class)
44
- # S Category in split (Category/Transfer/Class)
45
- # E Memo in split
46
- # $ Dollar amount of split
43
+ # L Category (Category/Subcategory/Transfer/Class)
44
+ # S Category in split (Category/Transfer/Class)
45
+ # E Memo in split
46
+ # $ Dollar amount of split
47
47
  # ^ End of the entry
48
48
  if (stripped.match(/^D/))
49
49
  @date = Qiflib::Date.new(line_value(stripped))
@@ -52,22 +52,16 @@ module Qiflib
52
52
  elsif (stripped.match(/^P/))
53
53
  @payee = line_value(stripped)
54
54
  elsif (stripped.match(/^C/))
55
- if ibank?
56
- @number = line_value(stripped)
57
- else
58
- @cleared = line_value(stripped)
59
- end
55
+ @cleared = line_value(stripped)
60
56
  elsif (stripped.match(/^N/))
61
- if ibank?
62
- @ibank_n = line_value(stripped)
63
- else
64
- @number = line_value(stripped)
65
- end
57
+ @ibank_n = line_value(stripped)
58
+ @number = line_value(stripped)
66
59
  elsif (stripped.match(/^M/))
67
60
  @memo = line_value(stripped)
68
61
  elsif (stripped.match(/^L/))
69
62
  @category = line_value(stripped).downcase
70
63
  elsif (stripped.match(/^S/))
64
+ @category = line_value(stripped).downcase if @category.size == 0 # default to first split category
71
65
  current_split['category'] = line_value(stripped).downcase
72
66
  elsif (stripped.match(/^E/))
73
67
  current_split['memo'] = line_value(stripped)
@@ -78,32 +72,32 @@ module Qiflib
78
72
  splits << current_split
79
73
  @curr_split = {}
80
74
  end
81
- end
82
- end
75
+ end
76
+ end
83
77
  end
84
-
78
+
85
79
  def ibank?
86
80
  @source_app == 'ibank'
87
81
  end
88
-
82
+
89
83
  def valid?
90
84
  return false if date.nil?
91
- return false if date.to_s.size < 8
85
+ return false if date.to_s.size < 8
92
86
  return false if date.to_s == '0000-00-00'
93
87
  true
94
- end
95
-
88
+ end
89
+
96
90
  def current_split
97
91
  @curr_split = {} if @curr_split.nil?
98
92
  @curr_split
99
93
  end
100
-
94
+
101
95
  def to_csv(idx=0)
102
96
  CSV.generate do | csv |
103
97
  csv << as_array(idx)
104
- end
98
+ end
105
99
  end
106
-
100
+
107
101
  def as_array(idx=0)
108
102
  array = []
109
103
  array << idx + 1
@@ -120,9 +114,9 @@ module Qiflib
120
114
  array << memo
121
115
  3.times { | i |
122
116
  if i < splits.size
123
- array << splits[i]['amount']
124
- array << splits[i]['category']
125
- array << splits[i]['memo']
117
+ array << splits[i]['amount'].to_s
118
+ array << splits[i]['category']
119
+ array << splits[i]['memo']
126
120
  else
127
121
  array << '0.0'
128
122
  array << ''
@@ -139,12 +133,12 @@ module Qiflib
139
133
  array << 'x'
140
134
  array
141
135
  end
142
-
136
+
143
137
  def line_value(s)
144
138
  return '' if s.nil? || s.size < 1
145
139
  s[1, s.size].strip
146
140
  end
147
-
141
+
148
142
  end
149
-
143
+
150
144
  end
data/lib/qiflib_util.rb CHANGED
@@ -173,6 +173,16 @@ module Qiflib
173
173
  lines
174
174
  end
175
175
 
176
+ # For testing purposes: Qiflib::Util::describe_csv_field_array(array)
177
+
178
+ def self.describe_csv_field_array(array)
179
+ field_map = Qiflib::csv_transaction_field_map
180
+ array.each_with_index { | val, idx |
181
+ field_name = field_map[idx]
182
+ puts "array[#{idx}].should == '#{val}' # #{field_name}"
183
+ }
184
+ end
185
+
176
186
  private
177
187
 
178
188
  def self.process_file_for_transactions(owner, filename, source, transactions)
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: qiflib
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 0.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Chris Joakim
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-08-25 00:00:00.000000000 Z
11
+ date: 2013-12-14 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rspec