- 締切済み
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 ---- また、できればソースも書いていただけるとありがたいのですが。。。 よろしくお願いいたします。
- みんなの回答 (1)
- 専門家の回答
みんなの回答
- _--_1l1_1_
- ベストアンサー率67% (102/152)
適当。表示がくずれるので空白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
補足
ご回答ありがとうございます。 実行してみたところ、正常にできました。 しかし、申し訳ないのですが、 if ( $current_line =~ m/^(\d\d:\d\d:\d\d)(.*)/ ) { $prev_time = $1; $prev_val = $2; } else { die "format error: $current_line"; } の部分で、書式があっているかを確認していると思うのですが、 実はファイルの先頭行から9行目は別の文字列と空行が挿入されているのです。 それを変更せずに出力させることは出来ないでしょうか??