• 締切済み

perlにて不足行の補完プログラム

毎分、特定の数値を取得し、外部のファイルに保存しているのですが、 前の時間と比較してデータの抜けがあった場合、 "データが抜けている時間"+"前回の数値"を追加して上書きをしたいのですが、どのようにしたらいいのでしょうか。 ご教授いただけると幸いです。 例) 補完前(読み込むファイル ・・・ acf.csv) ----- 00:01:00,227 00:02:00,234 00:04:00,254 ---- 補完後(書き込むファイル ・・・ acf.csv) ----- 00:01:00,227 00:02:00,234 00:03:00,234 00:04:00,254 ---- また、できればソースも書いていただけるとありがたいのですが。。。 よろしくお願いいたします。

みんなの回答

回答No.1

適当。表示がくずれるので空白2文字を全角空白にしていることに注意。 use strict; use warnings; use feature 'say'; use Time::Piece; my $prev_time = undef; my $prev_val = undef; while ( my $current_line = <DATA> ) {   $current_line =~ s/\x0D?\x0A?$//;  # chomp   if ( defined($prev_time) and defined($prev_val) ) {     if ( $current_line =~ m/^(\d\d:\d\d:\d\d)/ ) {       my $current_time = $1;       my $current_tp         = Time::Piece->strptime( $current_time, '%H:%M:%S' );       my $prev_tp = Time::Piece->strptime( $prev_time, '%H:%M:%S' );       my $compliment_tp = $prev_tp;       while ( ( $current_tp - $compliment_tp ) > 60 ) {         $compliment_tp += 60;         say $compliment_tp->strftime('%H:%M:%S') . $prev_val;       }     }   }   if ( $current_line =~ m/^(\d\d:\d\d:\d\d)(.*)/ ) {     $prev_time = $1;     $prev_val = $2;   }   else {     die "format error: $current_line";   }   say $current_line; } __DATA__ 00:01:00,227 00:02:00,234 00:04:00,254 00:05:00,123 00:08:00,250 ----- $ perl -w compliment.pl 00:01:00,227 00:02:00,234 00:03:00,234 00:04:00,254 00:05:00,123 00:06:00,123 00:07:00,123 00:08:00,250

pming
質問者

補足

ご回答ありがとうございます。 実行してみたところ、正常にできました。 しかし、申し訳ないのですが、   if ( $current_line =~ m/^(\d\d:\d\d:\d\d)(.*)/ ) {     $prev_time = $1;     $prev_val = $2;   }   else {     die "format error: $current_line";   } の部分で、書式があっているかを確認していると思うのですが、 実はファイルの先頭行から9行目は別の文字列と空行が挿入されているのです。 それを変更せずに出力させることは出来ないでしょうか??

関連するQ&A

専門家に質問してみよう