• ベストアンサー

perlでファイルの比較

"a.csv"と"b.csv"を比較して、一致しない場合は"a.csv"を"b.csv"に置き換えたいと思っています。 しかし、"a.csv"と"b.csv"の先頭9行は必ず一致しないデータが入っているので、 1行目~9行目まではチェックせずに、以降の行からチェックするようにしたいです。 このようにプログラムするにはどのようにしたらいいのでしょうか。 お手数をおかけしますが、ご教授いただけると幸いです。 また、見本のソース等をいただけると嬉しいです。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

配列の比較方法にもっと良い書き方がありそうですが、例えばこんな感じでしょうか。 use strict; use File::Copy 'move'; sub readfile { my ($filename, $lines_to_cut) = @_; open(my $fh, "<", $filename) or die "cannot open < $filename: $!"; my @lines = <$fh>; close($fh); return @lines[$lines_to_cut .. $#lines]; } sub is_same_array { my ($r0, $r1) = @_; my @a0 = @$r0; my @a1 = @$r1; if ($#a0 != $#a1) { return 0; } for (my $i = 0; $i < $#a0; $i++) { if ($a0[$i] ne $a1[$i]) { return 0; } } return 1; } my $LINES_TO_CUT = 9; my $FILE_A = 'a.csv'; my $FILE_B = 'b.csv'; my @a_csv = readfile('a.csv', $LINES_TO_CUT); my @b_csv = readfile('b.csv', $LINES_TO_CUT); if (is_same_array(\@a_csv, \@b_csv)) { print "$FILE_A and $FILE_B are same.\n"; } else { print "$FILE_A and $FILE_B are different.\n"; print "Moving $FILE_A to $FILE_B.\n"; move($FILE_A, $FILE_B); } readfileで各行が配列の要素となった配列を、$lines_to_cut行分だけ省いた形で返してもらえるので、is_same_arrayにて単純にその比較をして同じか違うかを判定しています。 CSVとして同じかどうかなんて判断していないので、CSVとしては同じものでも違う書き方をしていたら違うと判断します。例えば、"abc"とabcは同じと本来は解釈すべきですが、こいつは単純な配列の要素の比較しかしないので違うと判断します。

pming
質問者

お礼

素早い回答、ありがとうございます! 思い通りに動きました!

関連するQ&A