最新の1000個のデータをプロットするための一時ファイルの扱い方

このQ&Aのポイント
  • 最新の1000個のデータをプロットするためには一時ファイルを使用する方法があります。
  • 一時ファイルには最新のデータを書き込み、それまでのデータは削除することができます。
  • 具体的な手順としては、一番古いデータを削除し、新しいデータを一時ファイルに書き込むことです。
回答を見る
  • ベストアンサー

テキストファイルから文字を読み込み最初の行を削除

現在、リアルタイムでセンサーで値を取得してそれをファイルに書きだすと同時にgnuplotで描画するwindows(VC++)プログラムを作っております。 手順としては (1)ADCの装置から値が送信されるのでそれを取得 (2)fprintfでデータ書き出し (3)gnuplotでグラフを作る ということをやっています。 データの書き出し、リアルタイムでのグラフ表示はできるようになったものの、グラフを作る際、データがそれまで取った値全てのデータでグラフを作ってしまうので非常に膨大なデータをプロットしてしまいます。 そこで、「最新の1000個だけをプロットする」ようなことをしたいのですが、このとき、データを保存するファイルとは別に、一時ファイルを作り最新の1000個のデータをその一時ファイルに書き込みそれをplotすることを考えました。(1秒おきに、最新のデータが一番後ろの行について、1000個前のデータが削除される) しかしながら、「最初の行(1000個前のデータの行)を削除する」というところでどう実現すれば良いのか分からなくなってしまいました。 ご存じの方いらっしゃいましたら教えていただきたいです。 どうぞよろしくお願い致します。 ===== 一時ファイル ====== #a   b a0    b0    ←ここの行を削除したい! a1    b1    ・    ・    ・ a999 b999 a1000 b1000  ←ここが追加される

質問者が選んだベストアンサー

  • ベストアンサー
  • D-Matsu
  • ベストアンサー率45% (1080/2394)
回答No.3

「常にファイルに書く」のは処理コストも高いですから1000個のリングバッファで処理する方がいいんじゃないでしょうかね。 これなら常に最新の1000個分のデータが出ることになります。 あとは下記URLを参考にして標準入力に突っ込んでやれば良さそうです。 http://d.hatena.ne.jp/tanakaBox/20070826/1188078586

mugen_gen
質問者

お礼

どうもありがとうございます。 手動入力もできるとは! リングバッファも今ちょうど調べていました! これで完ぺきにできそうです どうもありがとうございます。

その他の回答 (2)

  • nora1962
  • ベストアンサー率60% (431/717)
回答No.2

書きだすデータ量、タイミングがシビアなら使えませんが GnuWin32などのtailコマンドを定期的に実行して、一時ファイルにリダイレクトしてはどうでしょう。

mugen_gen
質問者

お礼

GnuWin32ですか。少し私には難しいです>< ごめんなさい。勉強します。

  • bin-chan
  • ベストアンサー率33% (1403/4213)
回答No.1

読み込み行数カウンタを設けインクリメント。 指定範囲の場合のみ出力。 では? 一定時間ごとに出力ファイルを閉じ新たに開くことで出力ファイルそのものを変えるのも手かも。

mugen_gen
質問者

お礼

どうもありがとうございました

mugen_gen
質問者

補足

どうもありがとうございます。 実はgnuplotの数値データのplotの仕様で、 あるファイルを開いて最初の行からプロットするみたいで、困っております。 (途中からプロットするコマンドはなく、ファイルを通さず直にデータを送ることもできない) どうぞよろしくお願い致します。

関連するQ&A

  • エクセル削除行を別ファイルへ抽出

    エクセル初心者のため、お教え下さい。 Aファイル(1000行)より、行削除してBファイル(800行)を別ファイルとして保存しました。 削除した200行のデータをCファイルとして保存したいのですが、どうすれば良いでしょうか? ちなみに、Aファイル、Bファイルとも有ります。 どうぞよろしくお願いいたします。

  • C言語を用いて、GNUPLOTでリアルタイムにグラフ化方法について。

    C言語を使用して、GNUPLOTを呼び出し、時間とともに更新されていくデータをリアルタイムでグラフ化しようと思っていますが、なかなかうまくいきません。 私が考えていた簡単なプログラムのシーケンスとして、(OSはLinuxです。) ~データの作成~  fopen;データファイルの作成  fprintf;/データの作成  fclose;/データの保存 ~グラフ化~  popen;/GNUPLOTの呼出  fprintf(---,”plot \”[作成したデータファイル]\”\n”);/グラフ化 ~データの更新~  fopen;  fprintf;  fclose;/データの上書き ~グラフの更新~  fprintf(---,”reread\n”);/データの再読み込み  fprintf(---,”replot\n”);/グラフの更新 ~データの更新~ ~グラフの更新~ ・・・/ループ  pclose;/GNUPLOTの終了 と、データを更新したら、グラフ化をしていく予定でした(汗)。 テスト的に10回だけデータの更新をするプログラムを動作させると、 データの更新を先に全部行ってしまい、グラフ化されるのが、最後の更新データのみでした。 どのようにしたら、リアルタイムにデータをプロットできるでしょうか?? よろしくお願い致します。

  • テキストファイルの編集

    以前にもperlでのプログラミングについて質問させて頂いた者です。 前回と被る所があるのですがちょっと複雑で、私の手に負えないので質問させて頂きます。 よろしくお願いします。 データファイルAからデータを取得して、テキストファイルBの内容の一部を取得したデータで書き換えるという操作を行うプログラムを作りたいです。 具体的には、 データファイルA[A.txt]の中身 100 111  200 222 300 333 400 444 テキストファイルB[B.txt] 1st step 文字列1 start="123" end="134" 2nd step 文字列2 start="234" end="245" 3rd step 文字列3 start="345" end="356" 4th step 文字列4 start="456" end="467" という二つのファイルを読み込み、B.txtの""で囲まれた部分を、A.txtで取得したデータで置き換えるような操作を行いたいのですが・・。 A.txtの一行目で取得したデータをB.txtの1stステップの始まりと終わりの値として置き換え、それを二行目は2ndと同様の操作を行うようなプログラムを作りたいです。 もともとこのような操作を行いたくて前回のような質問をし、それを参考にし今日まで考えましたがやはり難しく、また頼りたいと思います。。 どうかよろしくお願いします。

    • ベストアンサー
    • Perl
  • gnuplotでplotができません

    QNXというOS(linuxベースのリアルタイムOS)を使っていて, 実験データをプロットしたく,gnuplotを使うことにしました. しかし,このOSにはgnuplotがデフォルトでインストールされて いなかったので,探してきてインストールし (gnuplot-4.**.tar.gzファイルを解凍→./configure→make→make install), 実行してみたところ,起動はするのですが, plot sin(x) などと打ってもターミナル上にグラフが表示されません. この原因,解決策が思いつく方がいれば教えていただけないでしょうか.

  • 英字を含まない文字行を削除

    英字を含まない文字行を削除 1491 1492 1493 1494 1495 1496 1497 1498 1499 149A 149B 149C 149D 149E 149F このような16進数が書かれたテキストファイルがあります。 149A 149B 149C 149D 149E 149F このように英字が含まれていない数字のみの行を削除する方法を教えてください。

  • データファイルをプロットする(gnuplot)

    gnuplotを使ってデータファイルをプロットしたいのですがうまくいきません。 gnuplot初心者です。よろしくお願いします。 plot "gtest.dat" とコマンドを打つと、 warning: Skipping unreadable file "gtest.dat" No data in plot となってグラフが表示されません。 ちなみにgtest.datの中身は、 1 20 2 60 3 80 4 60 5 100 です。 原因として自分で怪しいと思っているのは、 1.gtest.datの置いてある場所   Cドライブの下の適当なフォルダにおいて実行したのですが、これがまずいのでしょうか。   置く場所は決まっているのでしょうか。 2.DATファイルの作り方   gnuplotの使い方の説明のサイトではいつもファイルのプロットの際、DATファイルが使われていたので   自分もそれに合わせようとそたのですが作り方に自信がありません。   メモ帳で作成し保存の際、拡張子を.datに変更しました。   これでいいのっでしょうか。 長くなりましたが、よろしくお願いします。  

  • テキストファイルの変更

    以下のようなデータファイルを読み出して DATA_Aの値を123から567890に変更しようと した場合、一時ファイルを作成してから data.txtにリネームする以外にどのような方法が ありますか? # データは可変長のテキストファイルとします === data.txt === DATA_A=123 DATA_B=ABCDE

  • EXCELで約6000行の中から同じ行を削除。

    EXCEL初心者です。 約6000行のデーターの中から同じ名前の行を削除する方法を 教えていただけないでしょうか?   A    B   c   d   e  1  ○ 2  ○ ← 削除  3  ○ ← 削除 4  △ 5  △ ← 削除 よろしくお願いいたします。

  • C言語 3次元グラフ

    今、スペクトラムアナライザという計測機器をC言語を用いてデータを取得し、CSVファイルに書き込みました。その後、CSVファイルを開き、エクセルで3Dグラフ(等高線を用いました)にしようとしたのですが系列が255個までという制限がありました。私の取得したデータは461ポイントあるのでグラフを2分割しなければなりません。 CSVファイルの中身の一例としては 周波数,8000,9000,10000・・・ 11:00,-60E01,-61E01,-61E01・・・ 11:01,-62E01,-61E01,-60E01・・・ ・ ・ ・ ちょっと見づらいですが、1行目が周波数で1列目が取得した時間で2行目以降は周波数における電力です。プログラムとしてはデータを取得するコマンドを1秒ごとに送り、1行ごとにCSVファイルに書き込みをしています。 前置きが長くなりましたが、これを3Dグラフにするには何を学習しなければならないでしょうか?友達はWindowsプログラミングで書けばいいよと教えてくれたので、猫でも分かるWindowsプログラミングを買ってきたのですが中々難しそうで最初から挫折しそうです。後、いろいろ調べているとgnuplotという単語が良く出てくるのですが、 1)gnuplotで3次元グラフは作成できますか? 2)仮にgnuplotで3次元グラフが描けるなら、Windowsプログラミングとgnuplotではどちらを学習したほうがいいでしょうか? 参考書やお勧めのURLがあったらお願いします。

  • EXCELで文字検索したセルの行と前後の行の削除の方法

    EXCEL-VBAを使ってワークシートのデータ整形をしています。 ある文字列を検索し、その文字列を含む行とその前後の行を削除するロジックを記述したいのですがうまくできません。 例:検索文字列「合計」、"合計"の入っているセル「B120」のとき、B119~B121の3行分の行削除をしたい。 おそらく検索された文字列を含むセルの行番号を取得してその番号-1と+1の行を選択して削除すればよいのではないかと思ってるのですが、もっと良い方法があるのでしょうか? よろしくお願いします。

専門家に質問してみよう