プロが教えるわが家の防犯対策術!

50秒ごとに刻まれているcsvデータがあります。
↓↓↓
00:00:00
00:00:50
00:01:40
00:02:30
00:03:20
00:04:10
00:06:00
…(23:59になるまで続いています)

ここで現在、

各時間0分.30分になるとリストに書き出す処理を作成しており、分を30で割ったときの余りが0のときリストに書き出すという処理を行なっているのですが、この場合に上のデータだと
00:00:00
00:00:50
のデータが抽出されてしまいます。
取り出したいデータは各分1行としたいのです。

ですので、余りで判定する処理より画期的な処理がもしあればご享受していただきたいです。


①のプログラムの応用なのですが、50秒ごとに刻まれているデータだとどうしても存在しない分が出てきてしまいます。(上のデータだと00:05)
ここで、0分.30分のデータが存在しなかった場合に0分.30分次の行のデータ(1分.31分)を書き出す処理を作成するにはどのようなプログラムがあるでしょうか。
参考例等をご享受していただけると幸いです。

身勝手な質問ですみません。
どうしても閃かないので、よろしくお願い致します。

質問者からの補足コメント

  • みなさん回答ありがとうございます。
    大変厚かましいお願いなのですが、もし可能であれば簡単なものでいいので具体的なプログラムをご享受していただけると幸いです…。
    申し訳ありませんが、よろしくお願い致します。

      補足日時:2018/08/19 20:01

A 回答 (7件)

あなたの”分を30で割ったときの余りが0のときリストに書き出す”処理をそのまま生かして行う方法です。


①リストに書き出すとき、そのデータの時分を記憶する。
②次に読み込んだデータが書き出し対象になった時、そのデータの時分が、①で記憶したデータの時分と同じならそのデータはスキップする。

あなたの作成した処理に上記の①②を組み込んではいかがでしょうか。
    • good
    • 0

CSVファイルに改行で入っているデータなら、基本同じ行数間隔で必要なデータが得られる物ではないのでしょうか?



そして、

>ここで、0分.30分のデータが存在しなかった場合に0分.30分次の行のデータ(1分.31分)を書き出す処理を作成するには

とは、イレギュラーな行数間隔をもたらす物であるのなら補正をかければ宜しいのでは?
    • good
    • 0

開始がぴったり00秒からという前提だと実に簡単で、秒がゼロであるという判定条件を追加するだけです。

30分は1800秒だから50で割り切れる、つまり30分の時も00秒になるから同じ条件が通用します。ただしタイマのずれで開始が00:00:01などになった場合にも備えろってことになると、この方法はうまくいきませんが。

そういったズレ対策や記録落ちが起きた場合の対策としては、フラグを2個(00分出力済みフラグと30分出力済みフラグ)用意するのが簡単だと思います。概念としては以下のような感じです。これだと00分のデータが漏れていても、29:59までに来れば書き出されます。同様に30分のデータは59:59まで待てます。

'ループの外で初期化
flag00 = False
flag30 = False

If Not flag00 And 時刻の分<=29 Then
データを書き出す処理
flag00 = True
flag30 = False
EndIf

If Not flag30 And 時刻の分>=30 Then
データを書き出す処理
flag30 = True
flag00 = False
EndIf
    • good
    • 0

こんばんは



No4様も指摘なさっていらっしゃいますが、50秒毎なら5分間に6回のデータがあるはずなので、データが存在しない「分」は無いはずです。

>各時間0分.30分になるとリストに書き出す処理を作成しており~~
>00:00:00
>00:00:50
>のデータが抽出されてしまいます。
30分毎のデータを抽出するのではないのですか?
(1分毎を抽出したいのか?)

よくわかりませんが、以下のような考え方で処理すれば抽出したい時間帯での最初のデータを選べるはずと思います。
(仮に、データが飛んでいてもそのままで有効なはずです)

※ データは必ず昇順になっていると仮定しています。
1)初期値として、チェックタイムを0分にセット
2)チェックタイムが抽出の終了時間より小さく、データが存在する間は3)~6)の処理をループ
3)次のデータを取得
4)データの時間がチェックタイム未満なら次のデータへスキップ
5)チェックタイム以上なら、そのデータを抽出し、
  チェックタイムを30分後(必要な時間後)に再セットする
7)処理終了

>具体的なプログラムをご享受していただけると幸いです…。
不明な情報が多過ぎて、こちらで具体的なブログラムを記述すると、やたらと冗長になるばかりだと思います。(結果的に無駄な部分が多く、作成手間がかかるだけ)
質問者様は、その不明情報をご存じの筈ですので、上記のままをコード化すれば簡単なものですむものと思います。
    • good
    • 0

>①のプログラムの応用なのですが、50秒ごとに刻まれているデータだとどうしても存在しない分が出てきてしまいます。

(上のデータだと00:05)
これはないですね。
00:04:10
00:06:00
となっていますが
00:04:10
00:05:00
のはずです。
    • good
    • 0

No2です。


>大変厚かましいお願いなのですが、もし可能であれば簡単なものでいいので具体的なプログラムをご享受していただけると幸いです…。
あなたが作成したプログラムを提示してください。
それに追加します。
    • good
    • 0

(1)先頭行を書き出す。


(2)書き出した時刻+30分→次の時刻
(3)次の時刻以上の時書き出す。
(4)次の時刻に30分加算する。
(5)(3)へ

みたいな感じで考えればよろしいかと。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!