很多仪器导出的数据格式可能不是包含着奇奇怪怪的编码,这给写正则脚本带来了很大困难 binmode IN, ':encoding(UTF-8)' 这个命令进行处理编码,保证输入和输出的正确。
此外,因为需要遍历两层目录下的所有文件,发现了glob这个强大的命令。
use strict; use List::Util qw/sum/; #为了求和 #use warnings; #忽略警告吧,囧 my @dir; my @myfiles; open OUT, ">result.txt"; binmode OUT, ':encoding(UTF-8)'; #opendir (DIR, "./") or die "cannot open this directory"; my @ids = (1..37); print OUT "ID ".join(" ",@ids)." sum\n"; my $dir = ("./*/*/report.txt"); my @files = glob ($dir); foreach my $file (@files){ open IN, "<".$file; binmode IN, ':encoding(UCS-2LE)'; #奇奇怪怪的编码,唉 my @lines = <IN>; chomp @lines; my $ID = $lines[1];#这种编码的正则无能为力,只好直接提取第二行了 chop $ID; #chomp在此处无效,可能是因为编码问题,所以选择chop my @array = (); print OUT $ID." "; foreach (@lines){ if ($_ =~ m/\s+(\d+\.\d+)\s+(\d{1,2})\s+$/ ){ $array[$2-1] = $1; }elsif($_ =~ m/\s+(-)\s+(\d{1,2})\s+$/ ){ $array[$2-1] = $1; } } my $sum = sum(@array); $array[37] = $sum; #第38列为求和,带有奇怪编码的汉字太难搞定了 print OUT join(" ", @array)."\n"; close(IN); } print $#files; close(OUT);