# 2つの CSV ファイルを指定すると,それぞれにしか含まれない # 学生番号(を含む行)を列挙する。 # 学生番号の表記法は 030e1234 でも 030-E1234 でもよい。 # # UTF-8 対応 nkf は, # http://www01.tcp-ip.or.jp/~furukawa/nkf_utf8/ で入手。 # $file1= $ARGV[0]; # $file2= $ARGV[1]; # # # サブルーチンとのやりとりは,pass by reference なので注意!! # # 配列を引数をして渡してやらないと,後で上書きされてしまう。 # (*line1, *linenum1)= gakusei_list($file1, \@line1, \%linenum1); # (*line2, *linenum2)= gakusei_list($file2, \@line2, \%linenum2); # # diff_list($file1, \@line1, \%linenum1, \%linenum2); # diff_list($file2, \@line2, \%linenum2, \%linenum1); sub gakusei_list{ local($file, *line, *linenum)= @_; $i= 0; # open FH, "./nkf -de $file|"; open FH, "nkf -d $file|"; while(){ chomp; $line[$i]= $_; while( $_=~ /(\d\d\d)-?([LEJSMPTCDlejsmptcd])(\d\d\d\d)/g ){ $gbangou= $1.lc($2).$3; if ($linenum{$gbangou} ne "" and $linenum{$gbangou}!=$i){ printf("#warning: file=%s;line=%d: %s already appears in previous line.\n",$file,($i+1),$gbangou); } $linenum{$gbangou}= $i; } while( $_=~ /(\d\d\d\d\d\d\d\d)/g ){ # 教職員番号も $gbangou= $1; if ($linenum{$gbangou} ne "" and $linenum{$gbangou}!=$i){ printf("#warning: file=%s;line=%d: %s already appears in previous line.\n",$file,($i+1),$gbangou); } $linenum{$gbangou}= $i; } $i++; } return (\@line, \%linenum); } sub diff_list{ # 元の行をそのまま出力 local($file, *line1, *linenum1, *linenum2)= @_; printf("\n%s だけに存在 : \n",$file); foreach $key (sort { $linenum1{$a} <=> $linenum1{$b} } (keys %linenum1)){ unless (exists $linenum2{$key}){ printf("%d: %s\n",($linenum1{$key}+1),$line1[$linenum1{$key}]); } } } sub diff_list2{ # 学生番号だけを出力( sf() 基準でソート。) local($file, *line1, *linenum1, *linenum2)= @_; printf("\n%s だけに存在 : \n",$file); foreach $key (sort { sf($a) cmp sf($b) } (keys %linenum1)){ unless (exists $linenum2{$key}){ printf("%s\n",substr($key,0,3).'-'.uc(substr($key,3,1)).substr($key,4)); } } } sub diff_list3{ # User ID だけを出力( sf() 基準でソート。) local($file, *line1, *linenum1, *linenum2)= @_; printf("\n%s だけに存在 : \n",$file); foreach $key (sort { sf($a) cmp sf($b) } (keys %linenum1)){ unless (exists $linenum2{$key}){ printf("%s\n",$key); } } } sub diff_list4{ # 元の行をそのまま出力するが,sf() 基準でソート。 local($file, *line1, *linenum1, *linenum2)= @_; printf("\n%s だけに存在 : \n",$file); foreach $key (sort { sf($a) cmp sf($b) } (keys %linenum1)){ unless (exists $linenum2{$key}){ printf("%s\n",$line1[$linenum1{$key}]); } } } sub sf{ local($sfkey)= @_; # 学部 - 入学年度 - 番号 の優先順位でソート。 return substr($sfkey,3,1).substr($sfkey,0,2).substr($sfkey,4); } 1;