#!/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日

コメントする

perl adv
perl adv