• 締切済み

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 ---- また、できればソースも書いていただけるとありがたいのですが。。。 よろしくお願いいたします。

  • pming
  • お礼率40% (4/10)
  • Perl
  • 回答数1
  • ありがとう数0

みんなの回答

回答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

  • Perlで空白行を削除

    現在、Perlにて外部のcsvファイルを読み込み、"重複行"と"空白行"を削除するプログラムを作成しています。 重複行を削除する部分は ------ open(IN, "csvtime.csv"); @data = <IN>; close(IN); @data = grep {!$count{$_}++} @data; open(OUT, "> csvtime.csv"); print(OUT @data); close(OUT); ------ でできたのですが、空白行を削除する部分がわかりません。 申し訳ないのですが、お教えいただけないでしょうか。 また、空白行で最初の空白行は残すようにしたいです。 よろしくお願いいたします。 例) 読み出しデータ ----- (ヘッダ1行目) (ヘッダ2行目) (ヘッダ3行目) (必要な空白) (ヘッダ4行目) 00:00:00,302 00:01:00,274 00:02:00,272 00:03:00,248 00:04:00,237 00:05:00,239 00:05:00,239 00:06:00,256 00:07:00,260 00:08:00,250 00:09:00,253 00:10:00,241 ----- 加工後データ ----- (ヘッダ1行目) (ヘッダ2行目) (ヘッダ3行目) (必要な空白) (ヘッダ4行目) 00:00:00,302 00:01:00,274 00:02:00,272 00:03:00,248 00:04:00,237 00:05:00,239 00:06:00,256 00:07:00,260 00:08:00,250 00:09:00,253 00:10:00,241 -----

    • ベストアンサー
    • Perl
  • 行数の多い(65536行以上)csvファイルからピボットを作りたいので

    行数の多い(65536行以上)csvファイルからピボットを作りたいのですが、どうしたらよいでしょうか? 友人に、 1.アクセスにcsvファイルをとりこむ 2.エクセルのピボット作成で、外部データソースの取り込みを選ぶ 3.アクセスデータベスを選ぶ 4.アクセスのファイルのある場所を選んで、取り込んだファイルを選択 5.適当に「次へ」ですすんで、「完了」 でできるといわれたのですが、最後の「完了」の段階で、 「From句の構文エラー」 となってデータが取り込めません。 どなたか教えていただけないでしょうか。上記の方法でなくとも、行数の多いcsvファイルからピボットが作成できればいいのですが。

  • Perlでのファイル内データ処理方法について

    プログラミングを始めたばかりです。 Cygwin上でPerlを行っています。 下に示すように、計算プログラムの中にデータを記入し、そのデータを処理することは出来たのですが、外部のファイルを読みそのデータを処理する方法が分かりません。 # y = ax + bを求める @x=(1,2,3); @y=(1,4,9); for($i=0;$i<$n;$i++){ $A = $A + ($y[$i] * $y[$i]); $B = $B + ($x[$i] * $x[$i]);   ・   ・   ・ $a=・・・ $b=・・・ print("a=$a,b=$b"); パールファイル(.pl)内に @x=(1,2,3); @y=(1,4,9); のように記載すると、データが変わるたびにファイル内の数値を入れ替えないといけないと思うのですが、cygwinのウィンドウに、 $ ./lesson.pl 10 <data1.csv のように入力しEnterすると、ファイル内の数値を入れ替えないで指定したファイル(ここではdata1.csv)のデータが処理されると思うのですが、その場合パールファイルをどのように記述すればよいのでしょうか。また、cygwinのウィンドウにどのように入力すればよいのでしょうか。 よろしくお願いします。

    • ベストアンサー
    • Perl
  • perl初心者ですが、プログラム作成で行き詰ってしまいました。

    perl初心者ですが、プログラム作成で行き詰ってしまいました。 参考書を読みあさり、色々とググってみたのですが、どうしても組み立てられません。知識のある方ご回答よろしくお願いします。 一つ目は: 英語の文章を記憶したファイルを指定し,その内容を読み込み,文章内に含まれる単語を出現頻度の降順で表示させるプログラムを作成すること 「1位:・・・(・・回)」 「2位:・・・(・・回)」 ... なお,一つの単語が二行にまたがることはないものとする。 二つ目は: テストの成績データを記憶したCSV ファイルを指定し,その内容を読み込み,各学生の総合点と順位,各科目の最高点,最低点,平均点を記憶したCSVファイルを書き出すプログラムを作成せよ。 なお,入力用のファイルと出力用のファイルはキーボード入力で指定するものとする。 また,異なる学生数および科目数のCSV ファイルを読み込んでも正しく動作するようにすること。 卒業のかかったレポートで、この二つを完成させないと先に進めないのです。 本当に図々しい質問で大変申し訳ありません。知識のある方どうかご教授ねがいます。 *ひとつめに関しては: open (FILE, 'perl.txt') or die "$!"; while (my @array = <FILE>){ foreach (@array) { $count{ $_ }++ ; } @rank = sort { $count{ $b } <=> $count{ $a } } keys %count ; foreach (0..$#rank) { $kagi = $rank[ $_ ]; $kaisu = $count{ $kagi } ; print $_+1, "位:$kagi($kaisu 回)\n" ; } } のように書いたところで行き詰ってしまいました。 二つ目は: open (FILE, 'data.txt') chomp(@data = <FILE>) ; $i= 1 ; # 行番号を記憶する変数 for (@data) { # 各行に対して以下を繰り返す. # 各行の数値を配列の要素として記憶する. @list = split(/,/, $_) ; # サブルーチンを呼び出して,結果を表示 print "$i行目:" ; print "数値:",&cardinality(@list),"個," ; print "最大値:",&maximum(@list),"," ; print "最少値:",&minimum(@list),"," ; print "合計:",&summation(@list),"," ; print "平均:",&average(@list),"\n" ; # 行番号の更新 $i++ ; } とまで書き、もう何が何だか訳わからなくなってしまいました。

    • ベストアンサー
    • Perl
  • Perlでのファイル処理方法について

    プログラミングを始めたばかりです。 Cygwin環境でPerlを行っています。計算プログラムをPerlで書いています。 下に示すように、計算プログラムの中にデータを記入し、そのデータを処理することは出来たのですが、外部のファイルを読みそのデータを処理する方法が分かりません。 # y = ax + bを求める @x=(1,2,3); @y=(1,4,9); for(<stdin>){ for($i=0;$i<$n;$i++){ $A = $A + ($y[$i] * $y[$i]); $B = $B + ($x[$i] * $x[$i]);   ・   ・   ・ $a=・・・ $b=・・・ print("a=$a,b=$b"); open (IN, $file) or die "$!"でcsvファイルに記載されてある数値をCygwin上で実行することは出来ました。 作成したプログラムとcsvファイルをCygwinで入力して、入力したcsvファイルのデータを処理(直線近似して傾きを求めたりなど)したいのですが、どうすればよいのでしょうか。 よろしくお願いします。

    • ベストアンサー
    • Perl
  • Excelで、少しプログラムのようなことがしたいのですが・・・

    『A.csv』と『B.xls』のように、別々のexcelfile(または、sheet)で、どちらにも同じ項目の『C』という列があるとします。 その列の入力されているデータ(数値)が一致したとき、『B.xls』のfile(または、sheet)の『C』という列のセルにそのデータ(数値)記入させる。 …みたいなプログラムをExcelでしたいのですが、できるでしょうか?

  • CSVファイルの行が突然消える

    あるデータを抽出し、それをCSVファイルで取り込み、1つ取り込む ごとにCSVファイルが1行ずつ増えていきます。 適当な時期に、何行かたまった行を一気にAccessを用いてさらに取り込み ます。(取り込むのみ) あるとき、CSVファイルを開くと突然CSVファイルの行が減って いるのです。 何が起きているのでしょうか? Accessに何かマクロとか組んであって突然消えるのでしょうか? Accessを開く前と開いた後(取り込んだ後)で、特にCSVファイル に変更はありません。 あるとき突然CSVファイルを開くと昨日まであった行が突然 消えてしまうのです。(いつ起こるのか予測できていません。) CSVファイルにはマクロが組んであるようには見えません。 何かわかればお願いします。

  • csvのデーターファイルから任意の行をエクセルファイルへ入力するエクセ

    csvのデーターファイルから任意の行をエクセルファイルへ入力するエクセルVBA が上手くできません。 6列2000行のcsvデーターのテキストファイルの作成は、色々な参考書があり成功しました。次に このcsvのデーターファイルから任意の複数行をシート4などの任意のワークシートの任意の場所に60行程度をインポートして、この60行の数値データーを加工しようとしていますが、入力が上手くできません。数値データーの加工のプログラムは一応できているため、その様式にあわせて、所定の場所にデーターを入れる必要が有ります。 1列目には日付(シリアルの数値にしています)、その他はすべて数値(LONG型)です。エクセルは2003を使用しています。 VBAの初心者です。宜しくお願いいたします。

  • CSVデータ集計プログラムをおしえてください

    エクセルでは対応し切れないCSVファイル数値測定データ(65500個以上)があります。ある程度狭い範囲の値の数値が不規則にカンマ区切りで連続していてグラフにすると横に波のようにいくつもの山と谷が連続するかんじです。この数値郡に下限値を自由に変えられるようして設定し下限ラインから上に出た山毎の最大値を拾い出す。というプログラムをVBAで作りたいのですが、うまく出来ません。今はCSVデータをVBで開き、新たなファイルへ移せるところまで出来たのですが。その後が複雑すぎてわかりません。データが100万位になるのでVB単体で作ってます。助けてください(;o;)

  • 上書きしてしまったデータの復元

    毎日、特定の時間に外部HDDにデータを上書き保存しています。 あるとき、誤って必要なデータを同名の古いデータと上書きして入れ替えてしまいました。 このデータは復元することが出来るのでしょうか? もし出来る様なら、そのために必要な操作やツール等を教えていただければと思っています。 宜しくお願いいたします。

専門家に質問してみよう