C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[6]: csvファイルを読み込んで計算


(過去ログ 50 を表示中)

[トピック内 7 記事 (1 - 7 表示)]  << 0 >>

■27551 / inTopicNo.1)  csvファイルを読み込んで計算
  
□投稿者/ セルピコ (1回)-(2008/11/09(Sun) 17:09:55)

分類:[C/C++] 

2008/11/09(Sun) 17:31:47 編集(投稿者)
2008/11/09(Sun) 17:31:39 編集(投稿者)

プログラミング初心者で、visual C++ を使っています。

質問なんですが、現在csvファイルを読み込んで計算するプログラムを作りたいのですが、
いろいろ調べてやってもうまくいきません。csvファイルはA列に周波数、B列にデシベルの値がそれぞれ250ぐらいあります。
下のような感じです。
Freq FFT(dB)
15 -89.264
31 -85.809
46 -84.971
62 -98.448
・ ・
・ ・
・ ・
このデシベルのほうで、上から順にdB1、dB2、dB3・・・としていって、dBn-1<dBn>dBn+1となる3点を見つけるようにしたいのですが、どのようにすればよいのでしょうか?
できれば、周波数を上から順にf1=15,f2=31,f3=46・・・、デシベルをdB1=-89.264、dB2=-85.809、dB3=-84.971・・・と変数として宣言できれば簡単にできると思うのですが、可能なんでしょうか?

引用返信 編集キー/
■27555 / inTopicNo.2)  Re[1]: csvファイルを読み込んで計算
□投稿者/ dogatana (1回)-(2008/11/09(Sun) 19:11:33)
No27551 (セルピコ さん) に返信

> このデシベルのほうで、上から順にdB1、dB2、dB3・・・としていって、dBn-1<dBn>dBn+1となる3点を見つけるようにしたいのですが、どのようにすればよいのでしょうか?
> できれば、周波数を上から順にf1=15,f2=31,f3=46・・・、デシベルをdB1=-89.264、dB2=-85.809、dB3=-84.971・・・と変数として宣言できれば簡単にできると思うのですが、可能なんでしょうか?
>

セルピコさんのされたいことは
1)csvファイルから、プログラムで扱えるデータ列を生成する
2)データ列の中から所定の条件を満たす部分を見つけだす
の2つに分けられると思うのですが、どの点で上手くいかないのかを書かれたほうが良いのでは。

「f1=15,f2=31・・と変数として」とあるので、まずは1)のところで躓かれていると思います。
同じ型のデータをまとめて扱うのには、Cだと配列、C++だと配列/vectorを使えます。

配列: int freq[250];
vectorコンテナ: std:vector<int> freq;


引用返信 編集キー/
■27556 / inTopicNo.3)  Re[2]: csvファイルを読み込んで計算
□投稿者/ セルピコ (3回)-(2008/11/09(Sun) 19:27:56)

> セルピコさんのされたいことは
> 1)csvファイルから、プログラムで扱えるデータ列を生成する
> 2)データ列の中から所定の条件を満たす部分を見つけだす
> の2つに分けられると思うのですが、どの点で上手くいかないのかを書かれたほうが良いのでは。

dogatana さん回答ありがとうございます。説明不足で申し訳ありませんでした。
csvファイルを開いてそれを表示させるだけならできたのですが、おっしゃる通り、(1)の段階でつまずいております。
csvファイルからどのようにして、配列に入れることができるのですか?

引用返信 編集キー/
■27557 / inTopicNo.4)  Re[3]: csvファイルを読み込んで計算
□投稿者/ アキラ (120回)-(2008/11/09(Sun) 20:13:51)
アキラ さんの Web サイト
No27556 (セルピコ さん) に返信
>
> csvファイルを開いてそれを表示させるだけならできたのですが、おっしゃる通り、(1)の段階でつまずいております。
> csvファイルからどのようにして、配列に入れることができるのですか?

「C++ CSV」などで検索すれば、CSVを扱うライブラリはいくらでも見つかります。
セルピコさんの環境に合った方法を探してみてください。

たとえば

boost::tokenizerを使用した例
http://ml.tietew.jp/cppll/cppll/article/8275

標準ライブラリのみを使用した例
http://www.ohfuji.name/wordpress/?p=12
引用返信 編集キー/
■27558 / inTopicNo.5)  Re[4]: csvファイルを読み込んで計算
□投稿者/ dogatana (2回)-(2008/11/09(Sun) 20:33:56)
No27557 (アキラ さん) に返信
> ■No27556 (セルピコ さん) に返信
>>
>>csvファイルを開いてそれを表示させるだけならできたのですが、おっしゃる通り、(1)の段階でつまずいております。
>>csvファイルからどのようにして、配列に入れることができるのですか?
> 
> 「C++ CSV」などで検索すれば、CSVを扱うライブラリはいくらでも見つかります。
> セルピコさんの環境に合った方法を探してみてください。
> 
> boost::tokenizerを使用した例

これとvectorを組み合わせるのが素直かなとも思ったのですが、どうも「f1=15,f2=31,f3=46・・」とあることから、
まず配列で躓かれているようなので、厳しいかなと。

実験データの処理のためとか、*自分で使うため*のプログラムであれば、軽く済ませる手もありますね。

例えばこんな感じ。(Cプログラムで書いてます)

#include <stdio.h>

#define DATASIZE    1000

int     freqArray[DATASIZE];    /* 周波数用配列変数 */
double  dbArray[DATASIZE];      /* 強度用配列変数 */

int main(void)
{
    char    buf[256];
    int     index = 0;

    while (gets(buf)) {
        int     fval;
        double  dbval;
        if (sscanf(buf, "%d , %lf", &fval, &dbval) != 2) {
            printf("# データフォーマットエラー '%s'\n", buf);
            exit(1);
        } else if (index >= sizeof(dbArray) / sizeof(dbArray[0])) {
            printf("# データ数が最大個数(%d)を超過\n", sizeof(dbArray) / sizeof(dbArray[0]));
            exit(1);
        } else {
            printf("[%d] [%lf]\n", fval, dbval);
            freqArray[index] = fval;
            dbArray[index] = dbval;
            index++;
        }
    }
    printf("%d 個のデータを取得しました\n", index);
    // この時点で、index個のデータが freqArray[], dbArray[]に入ります
    // それを処理すればよいでしょう
    return 0;
}

引用返信 編集キー/
■27559 / inTopicNo.6)  Re[5]: csvファイルを読み込んで計算
□投稿者/ セルピコ (5回)-(2008/11/09(Sun) 21:14:56)
2008/11/09(Sun) 21:16:02 編集(投稿者)

No27558 (dogatana さん) に返信
> ■No27557 (アキラ さん) に返信

 アキラさん、dogatanaさん回答ありがとうございました。
少し、がんばってみます。
また、わからなくなったら質問させていただきますのでよろしくお願いします。

引用返信 編集キー/
■27560 / inTopicNo.7)  Re[6]: csvファイルを読み込んで計算
□投稿者/ セルピコ (6回)-(2008/11/10(Mon) 01:12:24)
2008/11/10(Mon) 01:13:29 編集(投稿者)

> ■No27558 (dogatana さん) に返信
>>■No27557 (アキラ さん) に返信

みなさん、ありがとうございました!!
作りたいプログラム完成いたしました。
私みたいな初心者にもわかるように優しく教えていただき
本当にありがとうございました。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -