仕訳データを取り込むのその後
で、結局、こうなった。
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