あおしまの日記

あおしまさんの日記らしいです。個人的に興味がある事を時々書きます。スマートウォッチPebble日本語パックを作成、公開しています。

XE-A407/A417用、月締データ抽出支援プログラム

以前にもSHARPレジスターのXE-A407/A417用のジャーナルからデータを吸い出す物を作ったのだが、いまいち実用性が無くてそのまま放っておきました。*1

やはりCSVファイルからデータを取って来たいと思いながら苦節2年、放置に放置を重ねて、年末になぜか閃いた方法でつるっと思うようなデータ抽出プログラムが書けたので置いておきます。このプログラムを元手にした商売をなさるかた以外に限り、もしperlがお判りなら勝手にお使い下さい。(改善点がありましたら逆に教えて下さい。)

前提条件として、SDカードの丸ごとのデータをSDbackupというところ以下においてある私の環境に則して例を作ってありますが、マウントしてあるSDカードを指定して、直に読みに行っても動くはずです。

ただし、処理したくないデータがあった場合はデータのほうを自分でつまみ出すなり整頓して下さい。

#!/usr/local/bin/perl
# 日計PLU、日計部門、日計集計を締め期間でひとまとめにするツール
# 第1引数:SDカード全体の内容が置いてあるトップの場所(../SDbackup/yyyymmdd/など)
# 第2引数:ジャーナル取りまとめを停めたい日(過去の停める日を指定:yymmdd形式)
# 現在から、数か月過去までの指定が出来る。
# 例:DドライブのSDbackupというフォルダにバックアップした日ごとにSDカードの内容が丸ごと入れてあるとする
#   20141201にバックアップしたSDカードの内容から、最新の日付(おそらくは11月30日)から
#   14年11月1日までのデータをまとめて出力する場合。
#   (締め期間が11月1日〜30日)
#      perl D:/SDbackup/20141201/ 141101

$startdir = $ARGV[0];
$stopmonth = $ARGV[1];

if ( -d $ARGV[0] ){
	$startdir = $ARGV[0];
	} 
else { die ; }


# カレントディレクトリ以下の全てのファイルを処理する。

	$fullpath = $startdir."/SHARP/ECRXXX13/REDISTER/SALES/";

	recursive($fullpath);

exit();

##### Subroutine
 
sub recursive
{
    my( $sBaseDir ) = @_;
    my( @FileLists, $sFileName );
    my $proc_date, $proc_no, $post_date, $post_no ;
 
    @FileLists = glob( $sBaseDir.'/*' );
 
    foreach $sFileName ( reverse sort @FileLists ){
    
        if ( -d $sFileName ){
            # ディレクトリだったら再帰呼び出し
            &recursive( $sFileName );
        } 
        elsif ( -f $sFileName ){
			# print($sFileName."\n" );

            # PLUJANX1.CSVファイルだったら処理する
            if ($sFileName =~ /.*\/((\d{6})\-(\d))\/PLUJANX1.CSV$/ ) {
				$proc_date = $2;
				$proc_no = $3;
				
				print ($proc_date."  ".$proc_no."\n") ;
				# print($sFileName."\n" );

			# 指定日(第2引数:yymmddフォーマット)よりも前の日は処理しない。
			# 現在処理月を抽出して数値化
				$date = substr($proc_date,0,6);
				$date = $date+0;

			# (filelistを逆順にソートした上で)枝番が最大の物(=前回よりも枝番が大きくなるとき)
			# もしくは前回処理の日付とは違う日付である時に実行
			# そのうえ、停止日より新しい日のみ処理する
				if ( ($date >= $stopmonth) and ( $proc_no > $post_no or $proc_date ne $post_date  )) {

					# PLUJANX1.CSVファイルを処理する
					# print($sFileName."\n" );
					print("PLU\n" );
					open (FH,$sFileName) or die;
            		while (<FH>) {
            		
						#CSV一行をスプリットして数量(3項目め)がゼロじゃない行だけ判別して出力。
            			@linedata = split(/,/,$_);
            			if ($linedata[2] ne "0") {
							print $proc_date.",";
							print;
            			}
            			else {
            				next;
            			}
					}
					close(FH);

					# DEPTX1.CSVファイルを処理したい
					
					$DEPTFileName = substr($sFileName,0,-12)."DEPTX1.CSV";
					# print($DEPTFileName."\n" );
					print("部門別\n" );
					open (FH,$DEPTFileName) or die;
            		while (<FH>) {
            		
						#CSV一行をスプリットして数量(4項目め)がゼロじゃない行だけ判別して出力。
            			@linedata = split(/,/,$_);
            			if ($linedata[3] ne "0") {
							print $proc_date.",";
							print;
            			}
            			else {
            				next;
            			}
					}
					close(FH);
					
					# TRANSX1.CSVファイルを処理したい
					
					$TRANSFileName = substr($sFileName,0,-12)."TRANSX1.CSV";
					# print($TRANSFileName."\n" );
					print("現金・信用計・値引等\n" );
					open (FH,$TRANSFileName) or die;
            		while (<FH>) {
            		
						#CSV一行をスプリットして数量(3項目め)がゼロじゃない行だけ判別して出力。
            			@linedata = split(/,/,$_);
            			if ($linedata[2] ne "0") {
							print $proc_date.",";
							print;
            			}
            			else {
            				next;
            			}
					}
					close(FH);

					$post_no = $proc_no;
					$post_date = $proc_date;
				}
            }

        }
    }
}

*1:id:aoshimak:20121019