fnb_pdf_to_csv 0.0.2

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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 183a2744177796522f8d2cb8fc99bf5edff5358e
4
+ data.tar.gz: 56f3cb527da92c169b6e5bb44690a4e4328aaa23
5
+ SHA512:
6
+ metadata.gz: 9a5cfa42da23d78bec0bd6abf01122402e0bb5054fb20d08e1942f8b7b69aca9988bb618eb7dc19a0c51f4af2482a8e17c9fc4cdf143742c4c896193ba07105b
7
+ data.tar.gz: 2a4eda17fb67e874d2883f8d6f4ae1bc03f41f41f2bb4d3cbf12a65de1a4d5d0cb12cd9c1c2807b9d2bdd561eb122a3522e986f175eef727be5e93262498b78d
data/.gitignore ADDED
@@ -0,0 +1,17 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in fnb_pdf_to_csv.gemspec
4
+ gemspec
data/LICENSE.txt ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2014 Jurgens du Toit
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,55 @@
1
+ # FNB PDF Convert to CSV
2
+
3
+ This gem provides the ability to convert a PDF FNB statement to a CSV file or statement.
4
+
5
+ ## Installation
6
+
7
+ Add this line to your application's Gemfile:
8
+
9
+ gem 'fnb_pdf_to_csv'
10
+
11
+ And then execute:
12
+
13
+ $ bundle
14
+
15
+ Or install it yourself as:
16
+
17
+ $ gem install fnb_pdf_to_csv
18
+
19
+ ## Usage
20
+
21
+ ```ruby
22
+ #!/usr/bin/env ruby
23
+ require 'thor'
24
+ require 'fnb_pdf_to_csv'
25
+
26
+ class Converter < Thor
27
+ desc 'csvfile source destination', 'Convert the PDF from source to destination. Destination will be a plain CSV file'
28
+ def csvfile(from, to)
29
+ parser = FnbPdfToCsv.parse from
30
+ parser.output to
31
+ end
32
+
33
+ desc 'file source destination', 'Convert the PDF from source to destination. Destination will be a tabbed CSV file'
34
+ def file(from, to)
35
+ parser = FnbPdfToCsv.parse from
36
+ parser.output to, "\t"
37
+ end
38
+
39
+ desc 'statement source destination', 'Convert the PDF from source to destination. Destination will mimick a FNB statement'
40
+ def statement(from, to)
41
+ parser = FnbPdfToCsv.parse from
42
+ parser.statement to
43
+ end
44
+ end
45
+
46
+ Converter.start(ARGV)
47
+ ```
48
+
49
+ ## Contributing
50
+
51
+ 1. Fork it
52
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
53
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
54
+ 4. Push to the branch (`git push origin my-new-feature`)
55
+ 5. Create new Pull Request
data/Rakefile ADDED
@@ -0,0 +1 @@
1
+ require "bundler/gem_tasks"
@@ -0,0 +1,26 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'fnb_pdf_to_csv/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = 'fnb_pdf_to_csv'
8
+ spec.version = FnbPdfToCsv::VERSION
9
+ spec.authors = ['Jurgens du Toit']
10
+ spec.email = ['jrgns@jrgns.net']
11
+ spec.description = %(Convert account statements from FNB in PDF to CSV)
12
+ spec.summary = %(Convert account statements from FNB in PDF to CSV)
13
+ spec.homepage = 'https://github.com/jrgns/fnb_pdf_to_csv'
14
+ spec.license = 'MIT'
15
+
16
+ spec.files = `git ls-files`.split($/)
17
+ spec.executables = spec.files.grep(/^bin\//) { |f| File.basename(f) }
18
+ spec.test_files = spec.files.grep(/^(test|spec|features)\//)
19
+ spec.require_paths = ['lib']
20
+
21
+ spec.add_runtime_dependency 'pdf-reader', '~> 1.3'
22
+
23
+ spec.add_development_dependency 'bundler', '~> 1.3'
24
+ spec.add_development_dependency 'rake', '~> 10.4'
25
+ spec.add_development_dependency 'rubocop', '~> 0.33'
26
+ end
@@ -0,0 +1,108 @@
1
+ require 'fnb_pdf_to_csv/version'
2
+ require 'pdf-reader'
3
+ require 'csv'
4
+
5
+ class FnbPdfToCsv
6
+ attr_reader :lines
7
+
8
+ AMOUNT = '\(?[0-9][0-9,]*\.[0-9]{2}\)?(Cr)?'
9
+ DATE = '\d{2} \w{3}'
10
+
11
+ def initialize file
12
+ @reader = ::PDF::Reader.new file
13
+ @lines = []
14
+ end
15
+
16
+ def self.parse file
17
+ parser = self.new(file)
18
+ parser.parse
19
+ parser
20
+ end
21
+
22
+ def parse
23
+ @reader.pages.each { |page| parse_page page }
24
+ end
25
+
26
+ def output file, separator = ','
27
+ f = File.new file, 'w'
28
+ f.write [
29
+ 'Date','Description1','Description2','Description3','Amount','Balance','Accrued Charges'
30
+ ].to_csv(col_sep: separator)
31
+
32
+ lines.each { |line| f.write clean_line(line).to_csv(col_sep: separator) }
33
+ end
34
+
35
+ def statement file
36
+ f = File.new file, 'w'
37
+ f.write "5,'Number','Date','Description1','Description2','Description3','Amount','Balance','Accrued Charges'\n"
38
+
39
+ count = 1
40
+ lines.each do |line|
41
+ f.write statement_line(line, count).join(',') + "\n"
42
+ count = count + 1
43
+ end
44
+ end
45
+
46
+ def statement_line line, count
47
+ sline = line.dup
48
+ sline.insert(0, 5)
49
+ sline.insert(1, count)
50
+ sline[2] = "'#{sline[2]}'"
51
+ sline[3] = '"' + sline[3] + '"' unless (sline[3].nil? or sline[3] == '')
52
+ sline[4] = '"' + sline[4] + '"' unless (sline[4].nil? or sline[4] == '')
53
+ sline[5] = '"' + sline[5] + '"' unless (sline[5].nil? or sline[5] == '')
54
+ sline[6] = clean_amount(sline[6])
55
+ sline[7] = clean_amount(sline[7])
56
+
57
+ sline
58
+ end
59
+
60
+ def parse_page page
61
+ page.text.each_line { |line| parse_line line }
62
+ end
63
+
64
+ def parse_line line
65
+ line.match(/^\s*(#{DATE})(.*?)(#{AMOUNT})\s+(#{AMOUNT})(\s+#{AMOUNT})?$/) do |m|
66
+ @lines.push mangle_line!(m.to_a)
67
+ end
68
+ end
69
+
70
+ def clean_date(date)
71
+ day, month = date.split(/\s/)
72
+ Time.new(Time.new.year, month, day.to_i).strftime("%Y-%m-%d")
73
+ end
74
+
75
+ def clean_amount(amount)
76
+ return amount if amount.nil?
77
+ return 0 - amount[1..-2].to_f if amount[0] == '(' and amount[-1] == ')'
78
+ if amount[-2..-1] == 'Cr'
79
+ return amount[0..-3].tr(',', '').to_f
80
+ else
81
+ return 0 - amount.tr(',', '').to_f
82
+ end
83
+ end
84
+
85
+ def clean_line(line)
86
+ sline = line.dup
87
+ sline[0] = clean_date sline[0]
88
+ sline[4] = clean_amount sline[4]
89
+ sline[5] = clean_amount sline[5]
90
+ sline[6] = clean_amount sline[6]
91
+
92
+ sline
93
+ end
94
+
95
+ def mangle_line! arr
96
+ arr.delete_at 0
97
+ arr.map! { |elm| elm.strip unless elm.nil? } # Cleanup
98
+
99
+ arr.delete_at 3
100
+ arr.delete_at 4
101
+ arr.delete_at 5
102
+ arr[1] = arr[1].split(/\s{2,}/) # We get the three descriptions as one string
103
+ arr.insert(2, arr[1][1]) # So split them up and add them back
104
+ arr.insert(3, arr[1][2])
105
+ arr[1] = arr[1][0]
106
+ arr
107
+ end
108
+ end
@@ -0,0 +1,3 @@
1
+ class FnbPdfToCsv
2
+ VERSION = "0.0.2"
3
+ end
metadata ADDED
@@ -0,0 +1,108 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: fnb_pdf_to_csv
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.2
5
+ platform: ruby
6
+ authors:
7
+ - Jurgens du Toit
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2015-08-23 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: pdf-reader
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.3'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.3'
27
+ - !ruby/object:Gem::Dependency
28
+ name: bundler
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '1.3'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '1.3'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rake
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '10.4'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '10.4'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rubocop
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '0.33'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '0.33'
69
+ description: Convert account statements from FNB in PDF to CSV
70
+ email:
71
+ - jrgns@jrgns.net
72
+ executables: []
73
+ extensions: []
74
+ extra_rdoc_files: []
75
+ files:
76
+ - ".gitignore"
77
+ - Gemfile
78
+ - LICENSE.txt
79
+ - README.md
80
+ - Rakefile
81
+ - fnb_pdf_to_csv.gemspec
82
+ - lib/fnb_pdf_to_csv.rb
83
+ - lib/fnb_pdf_to_csv/version.rb
84
+ homepage: https://github.com/jrgns/fnb_pdf_to_csv
85
+ licenses:
86
+ - MIT
87
+ metadata: {}
88
+ post_install_message:
89
+ rdoc_options: []
90
+ require_paths:
91
+ - lib
92
+ required_ruby_version: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ required_rubygems_version: !ruby/object:Gem::Requirement
98
+ requirements:
99
+ - - ">="
100
+ - !ruby/object:Gem::Version
101
+ version: '0'
102
+ requirements: []
103
+ rubyforge_project:
104
+ rubygems_version: 2.4.6
105
+ signing_key:
106
+ specification_version: 4
107
+ summary: Convert account statements from FNB in PDF to CSV
108
+ test_files: []