#!/usr/local/bin/perl
use utf8;
use Modern::Perl;
use List::MoreUtils qw(firstidx);
use Text::CSV_XS qw(csv);
use Text::Trim;
use YAML::Syck;
# https://www.mizuhobank.co.jp/corporate/ebservice/cb/webreport/manual/pdf/manual_cb.pdf
# CSVファイルのフォーマットを教えてください。
# p110 預金取引明細表
sub parse_mizuho_report_csv {
my ($file) = @_;
state @header1 = qw(
データ区分
店番号
口座番号
作成年月日
西暦
期間(開始)
期間(終了)
科目
);
state @header2 = qw(
データ区分
取引日
取引区分
取引情報(1)
お引き出し額
取引情報(2)
取引情報(3)
取引情報(4)
お預け入れ額
取引情報(5)
差引残高
摘要
合計件数(引出)
合計件数(預入)
合計金額(引出)
合計金額(預入)
合計文言
決済日
);
my sub idx2 ($) { my $name = $_[0]; my $idx = firstidx { $_ eq $name } @header2; die $name unless $idx > -1; $idx };
my $aoa = csv( in => $file );
my @rows1 = grep $_->[0] eq 1, @$aoa; die unless @rows1 == 1;
my @rows2 = grep $_->[0] eq 2, @$aoa;
my %h;
# 1
@h{@header1} = @{$rows1[0]};
delete $h{データ区分};
# 2
{
my $cols = pop @rows2;
die unless $cols->[idx2 '合計文言'] eq '最終残高';
$h{最終残高} = trim $cols->[idx2 '差引残高'];
}
{
my $cols = pop @rows2;
die unless $cols->[idx2 '合計文言'] eq '合計金額';
$h{'合計金額(引出)'} = trim $cols->[idx2 '合計金額(引出)'];
$h{'合計金額(預入)'} = trim $cols->[idx2 '合計金額(預入)'];
}
{
my $cols = pop @rows2;
die unless $cols->[idx2 '合計文言'] eq '合計件数';
$h{'合計件数(引出)'} = trim $cols->[idx2 '合計件数(引出)'];
$h{'合計件数(預入)'} = trim $cols->[idx2 '合計件数(預入)'];
}
for (@rows2) {
my @idx = idx2 '取引日' .. idx2 '摘要';
my %kv;
@kv{ @header2[@idx] } = map trim, @$_[@idx];
push @{$h{取引}}, \%kv;
}
\%h;
}
my $ref = parse_mizuho_csv "mizuho_web_report/XXXXXXXXXXXXX201912XX.csv";
say Dump $ref;
__END__
% ./parse_mizuho_report_csv.pl
---
作成年月日: 2019年12月XX日
取引:
-
お引き出し額: ''
お預け入れ額: ''
取引区分: ''
取引情報(1): ''
取引情報(2): 繰越
取引情報(3): ''
取引情報(4): ''
取引情報(5): ''
取引日: 2019-12-XX
差引残高: XXX
摘要: ''
-
お引き出し額: ''
お預け入れ額: XXX
取引区分: ''
取引情報(1): ''
取引情報(2): 振込 カ)XXXXXXXXX
取引情報(3): ''
取引情報(4): ''
取引情報(5): ''
取引日: 2019-12-XX
差引残高: XXX
摘要: ''
口座番号: XXXXXXX
合計件数(引出): 0
合計件数(預入): 1
合計金額(引出): 0
合計金額(預入): XXX
店番号: 'XXXX'
最終残高: XXX
期間(終了): 普通預金
期間(開始): 2019年12月XX日
科目: ~
西暦: 2019年12月XX日