質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.53%

  • Python 3.x

    6297questions

    Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

積算値の差分計算(積算値リセット時の処理)

受付中

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 142

y.tebi

score 1

積算値をもらって差分計算をするのですが、1回目はOKで、2回目以降がNGとなってしまいます。

・積算値はcsvから前回値を取得する
・今回取得した積算値と前回の積算値から差分を算出する
・積算値をcsvに書き込む
・プログラムは、毎分動作します

通常の動きは問題ないのですが、積算値がリセットされる時があり、
その時の処理が思ったようになりません。

【通常】
csvから取得した前回値:5
今回のカウント値:10
差分:5
今回の積算値:15 → csvに書き込み

【積算値リセット時】
csvから取得した前回値:20
今回のカウント値:2(取得済)
差分:-18
今回の積算値:2(本当は20+2=22としたい) → csvに書き込み

【積算値リセット時 2回目の処理】
csvから取得した前回値:2
今回のカウント値:2(取得済で積算値変更ない場合)
差分:2
今回の積算値:4(本当は前回値22+0(差分なし)=22としたい) → csvに書き込み

リセット後の積算値が0であれば問題ないのですが、次の読み込みの際にすでにカウントされていると0ではなく2次の積算値となるので、マイナスになってしまいます。

リセットのタイミングが取得できればいいのですが、取る方法がないので、ソフトでなんとかしたいのですが。。。
条件が悪いのでしょうか?

以下、プログラムです。

前回値との差分=今回の積算値ー前回の積算値(csvから取得済)
lastdiff = int(plscnt) - int(lastplscnt_m)

差分がマイナスを条件
if lastdiff < 0:
lastdiff = 0
tot_cnt = lastplscnt_m + plscnt
else:
tot_cnt = int(lastplscnt_m) + int(lastdiff)

差分を算出→クラウドへ
plscnt_mindiff = int(tot_cnt) - int(lastplscnt_m) 

※tot_cnt を今回の積算値としてcsvに書き込みます。

積算値がリセットされてしまったときは、前回の積算値にプラスしたものをcsvに書き込みたいです。
差分はマイナスではなく、前回値からリセット後の積算値を足したものにしたいです。

2回目以降の処理が、今回の積算値になってしまい、積算値は変わっていないのに足されています。

ご教示の程、どうぞよろしくお願い致します。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

+1

積算値をリセットしたときの(直前の)積算値を得るようにしないとどーしよーもないと思いますが。

いまいちはなしがみえませんが、
そのCSVというのはどうやって取得するんでしょうか
んで、CSVを書き込むとはファイルに書き込むんでしょうか?


【積算値リセット時】
csvから取得した前回値:20
今回のカウント値:2(取得済)
差分:-18
今回の積算値:2(本当は20+2=22としたい) → csvに書き込み 

リセットが、積算値20のときに行われたという保証はあるんでしょうか。
それがあるというならそういう計算式で構わないと思いますが。

また、次回取得までの間にリセットが2回実行されるということはないんでしょうか

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/07/27 21:54

    ご指摘、ありがとうございます。
    説明不足で申し訳ございません。

    CSVは、書き込み=CSVファイルに書き込み(追記)
    取得は、csvファイルの一番最後の値を取得し、前回値としています。

    また、積算値20の時は、実際に記載のとおりになりました。
    2回目が意図しない動きで、解決策が見当たりません。

    次回取得までにリセットが2回はありませんでした。

    キャンセル

  • 2018/07/27 21:59

    いや、ありませんじゃなく、あり得るのかありえないか、です。

    > 積算値20の時は、実際に記載のとおりになりました。
    たまたまその通りになった、というわけじゃなく、
    その時のリセットは20のときに実行された、という確証はあるんでしょうか?

    これらがないと、積算値の差分計算、というのは全く無意味となりますが。

    キャンセル

  • 2018/07/27 22:11

    度々申し訳ございません。
    次回取得までにリセット2回はあり得ません。
    また、何度もリセットの時には同じ動きになっていますので、確証はあります。

    キャンセル

  • 2018/07/27 22:19

    なら、その2回目以降の差分計算もそのとおり、ということになって問題はない、ということになりますね

    キャンセル

  • 2018/07/27 22:41

    そうですか。
    22ではなく、2になってしまっているのですが。。。
    問題ないのですね。

    キャンセル

  • 2018/07/27 22:54

    そう確定している、といっているのはあなたです。
    積算値が間違っているのか、あなたの言ってることが間違っているのか、どちらかなんでしょうけどねw

    キャンセル

  • 2018/07/27 23:07

    残念です。
    本当に困っているので他で聞いてみます。

    キャンセル

  • 2018/07/27 23:10

    困っているなら真摯に対応してください。
    間違ったことや嘘を言われると、こちらはどーしよーもなくなります

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.53%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

  • 解決済

    型変換のエラー

      while (cnt = fin.read(inbuf, BUF_SIZE))  の部分ですが、  invalid conversion from ‘void*’ to ‘in

  • 受付中

    C++でCSVファイル処理

    大学の研究で実験データをC++を使って処理しようと考えて, 実験によってデータ点数は5万点前後とまちまちなのですが, 0000や0001のように連続した番号の名前のCSVファイルを

  • 解決済

    ポインタ渡しと文字列比較

    C言語初心者です。 文字列rawcがリストlistの中に入っていない(登録されていない)とき、 その文字列をリストの登録されている最後に格納する関数regを作成しました。 既に登

  • 受付中

    【Android】サムネイル一覧画像表示をやりたい

    【Android】サムネイル一覧画像表示をやりたい こんな感じのサムネイルを作成したいのですが、この画像たちはネットから読んでくる必要があります。 基準となるレ

  • 受付中

    関数の戻り値、構造体

    標準入力から20個以下のデータを受け取り、受け取ったデータの数、平均値、標準偏差、最大値および最小値を求め、表示するプログラムを作りたいです。計算は、ユーザー定義関数により行い、関

  • 解決済

    c言語学習中の学生です。

    前提・実現したいこと c言語を学んでいる学生です。 非常に低レベルな質問ですがお願いします。 Windows10でmingwを使っています。 発生している問題・エラーメッセージ

  • 解決済

    SQL結果表示件数取得するには?

    SELECT * FROM( SELECT * FROM tbl ORDER BY modified DESC LIMIT 20 ) as dummy order by rand(

  • 解決済

    awkを使ってMySQLのステータス変数を整形したい

      書籍ハイパフォーマンスMySQLを参考に、以下のようなループでMySQLのステータス変数をファイルに追記しています。 """"" while test -e $RUNFIL

同じタグがついた質問を見る

  • Python 3.x

    6297questions

    Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。