aboutsummaryrefslogtreecommitdiffstats
path: root/ledgerscripts/csv_processor.pl
diff options
context:
space:
mode:
Diffstat (limited to 'ledgerscripts/csv_processor.pl')
-rw-r--r--ledgerscripts/csv_processor.pl111
1 files changed, 111 insertions, 0 deletions
diff --git a/ledgerscripts/csv_processor.pl b/ledgerscripts/csv_processor.pl
new file mode 100644
index 0000000..dafbe95
--- /dev/null
+++ b/ledgerscripts/csv_processor.pl
@@ -0,0 +1,111 @@
+#!/usr/bin/perl
+
+use strict;
+use warnings;
+use 5.010;
+
+use Text::CSV;
+use JSON;
+
+my $csv = Text::CSV->new({
+ sep_char => ',',
+ binary => 1,
+ quote => "\N{FULLWIDTH QUOTATION MARK}"}
+);
+
+my %transaction;
+my @jlist; # used to create the categories json fil0
+my $cat_json;
+
+my $file = $ARGV[0] or die "Need to get CSV file on the command line\n";
+open(my $csvdata, '<:encoding(UTF-8)', $file) or die "Could not open '$file' $!\n";
+
+{
+ open(my $category_file, '<', "categories.json") or die "Could not open category file $!\n";
+ local $/ = undef; # slurp mode!
+ $cat_json = <$category_file>;
+}
+
+my $catref = decode_json $cat_json;
+my $cats = $catref->{"data"};
+# say qq($catref_d->[0]->{"desc"});
+
+my @descs = map $_->{"desc"}, @{$cats};
+
+sub get_category_from_desc {
+ my $desc = shift;
+ for my $hsh (@{$cats}) {
+ if ($desc eq $hsh->{"desc"}) {
+ return $hsh->{"category"};
+ }
+ }
+}
+
+while (my $line = <$csvdata>) {
+ $line =~ s/^\N{BOM}//;
+ chomp $line;
+ if ($csv->parse($line)) {
+ my @fields = $csv->fields();
+ $transaction{day} = substr $fields[0], 0, 2;
+ $transaction{month} = substr $fields[0], 3, 2;
+ $transaction{year} = substr $fields[0], 6, 4;
+ $transaction{date} = $fields[0];
+ $fields[1] =~ s/\s+/ /g;
+
+ # used to create the categories json file - see below
+ push @jlist, {"desc" => $fields[1], "category" => "NONE"};
+
+ $transaction{desc} = $fields[1];
+ $transaction{cost} = $fields[2];
+
+ for my $d (@descs) {
+ if ($transaction{desc} eq $d) {
+ $transaction{exp_type} = get_category_from_desc $d;
+ }
+ }
+
+ if ($fields[1] =~ /^.+(VIS|DR|DD|TFR|CR|SO|ATM|\)\)\))$/) {
+ $transaction{type} = $1;
+ } else
+ { die("CANNOT DETERMINE TYPE!\n")}
+
+ if ($fields[2] =~ /^\-/) {
+ $transaction{expense} = 1;
+ } else
+ { $transaction{expense} = 0; }
+
+ print join "", (
+ $transaction{year},
+ "/",
+ $transaction{month},
+ "/",
+ $transaction{day},
+ " ",
+ "*",
+ " ",
+ $transaction{desc}
+ ), "\n";
+ if ($transaction{expense} == 1) {
+ (my $cost = $transaction{cost}) =~ s/^\-//;
+ print qq(\t$transaction{exp_type}\t$cost\n);
+ print "\tassets:hsbc current\t$transaction{cost}\n";
+ print "\n";
+ } else {
+ print "\tincome:baws\t-$transaction{cost}\n";
+ print "\tassets:hsbc current\t$transaction{cost}\n";
+ print "\n";
+ }
+ } else
+ { warn "Line could not be parsed: $line\n";}
+}
+
+
+
+# The following code is used to output a JSON file
+# to be used for categories. Uncomment for use.
+# my $data = encode_json {data => \@jlist};
+
+# open(my $fh, '>', "/tmp/categories.json") or die "Could not open file '/tmp/toss.json' $!";
+# print $fh $data;
+# close $fh;
+# print "done\n";