仕訳データを取り込むのその後

で、結局、こうなった。

use v5.14;
use strict;
use warnings;
use utf8;
use FindBin;

my $yyyy = 2013;
my $data_dir = $FindBin::Bin . '/' . $yyyy;

# debtor: 借方
# creditor: 貸方
# tax_class: 税区分
# summary: 摘要
write_data( 'import/01_新聞図書費.csv', {
    files => [ '書籍.txt' ],
    template => { debtor_id => 241, tax_class => 3, creditor_id => 100, summary => "書籍代" }
} );

sub load_csv {
    my $files_ref = shift;
    my $arg_ref = shift;

    my @data = ();
    foreach my $file (@{$files_ref}) {
        my $in_file = $data_dir . '/' . $file;
        open(my $fh, '<:encoding(utf-8)', $in_file) or die $! . " : cannot open $in_file";

        while (<$fh>) {
            chomp;
            my @tmp = split /,/, $_;

            my %h = %{$arg_ref};
            if ( my ($MM, $dd) = $tmp[0] =~ /(1?\d)\/([1-3]?\d)/ ) {
                $h{date} = sprintf( "%04d/%02d/%02d", $yyyy, $MM, $dd );
            }
            else {
                warn $_, ' <<< date is wrong!', " $file($.)\n";
                next;
            }

            if ( my ($price) = $tmp[1] =~ /(\d{2,6})/ ) {
                $h{price} = $price;
            }
            else {
                warn $_, ' <<< price is wrong!', " $file($.)\n";
                next;
            }

            if ( 3 <= scalar(@tmp) ) {
                $h{summary} = $tmp[2];
            }

            push @data, \%h;
        }

        close $fh;
    }

    return \@data;
}

sub write_data {
    my $out_file = shift;
    my $arg_ref = shift;

    my $data_ref = load_csv( $arg_ref->{files}, $arg_ref->{template} );
    my @my_keys = split /,/, 'date,debtor_id,,price,tax_class,creditor_id,,price,,summary';

    local $\ = "\r";
    open my $fh, '>:encoding(utf-8)', $out_file or die $! . " : cannot open $out_file";
    foreach my $data (sort { $a->{date} cmp $b->{date} } @{$data_ref}) {
        my @wk = map { ( $_ ) ? $data->{$_} : $_; } @my_keys;
        print $fh join(',', @wk);
    }
    close $fh;
}

ポイントは、複数のファイルから1つの取り込みデータを出力するところ。
そうでもしないと、取り込み作業が増えてしまうので。
あとは、貸方IDを指定したいケースだけど、それは手数でカバーですかね。

ほんと面倒だけど、ちゃんとやります・・・。

おしまい。

Leave a Comment