みなさん,こんにちは.
おかしょです.
大学の授業で実験を行うと,実験結果のデータをcsvファイルで渡されることが多いです.
ほとんどの人はExcelで開いて,グラフを作ったりすると思いますが,Processingで処理を読み込んでみようと思います.
そもそも,なぜこのようなことをしようと思ったのかというと,学会の発表でアニメーションを作りたいと思ったのがきっかけでした.
私は制御工学を専門としているため,数値シミュレーションをよくやります.
これまでの学会発表では,その数値シミュレーションの結果を時系列グラフにして示していました,
しかし,ロボットの動きはグラフだけではイメージしずらいことがあります.
アニメーションにした方が直接的でわかりやすいと思ったことがきっかけでした.
なので,この記事ではProcessingでcsvファイルのデータを読み込む方法を解説します.
この記事を読むと以下のようなことがわかる・できるようになります.
- csvファイルとは
- Processingでcsvファイルを読み込む方法
この記事を読む前に
この記事ではProcessingというアニメーションを作れるフリーソフトを使用します.
Processingをまだインストールしていない方は以下の記事を参考にインストールしてください.
csvファイルとは
まず,csvファイルとは何か知りたい方のために,csvファイルがどのようなファイルなのかを説明します.
csvファイルのcsvというのはcomma separated value の略で,値 (value)をカンマ (comma)で分けた (separate)という意味です.
つまり,csvファイルをテキストで開くと以下のようになっています.
1, 2, 3
4, 5, 6
7, 8, 9
10, 11, 12
たいていの場合,列ごとにデータが格納されています.
例えば,1列目は時間のデータが格納されていて,2列目は姿勢角,3列目は角速度という感じです.
このようなファイル形式はプログラムで出力するのが非常に簡単なため,実験結果などはこの形式で出力されることが非常に多いです.
Processingでcsvファイルを読み込むには
csvファイルをProcessingで読み込むにはloadTableというコマンドを使います.
Table a;
a = loadTable(filename);
loadTableコマンドの引数には,保存されているcsvファイルの名前を入力します.
このとき,ファイル名はダブルクォーテーション(二重引用符)で囲います.
例:”filename”
さて,ここからはcsvファイルの1列目に時間,2列目から4列目に3軸の姿勢角が格納されているとして,解説していきます.
まず,時間や姿勢角などの文字を以下のようにfloat型で定義しておきます.
float[] Time, Phi, Theta, Psi;
このとき,配列で宣言しているのは,各要素にcsvファイルのすべてのデータを格納しているためです.
ここで,問題になってくるのが配列の要素数です.
csvファイルにあるデータ数がわかっていれば大した問題にはなりませんが
csvファイルをいくつも処理する必要がある場合などで,データ数がそれぞれ異なる場合は,いちいちデータ数を確認して処理するのは面倒くさいです.
そこで,データ数を自動的に確認して配列の要素を定義できるようにします.
そこで使えるのが,先程csvファイルをloadTableで読み込んだTableクラスのaという変数です.
このaを使うことで,クラス内の行数や列の数を取得することができます.
具体的には以下のようなプログラムで取得することができます.
int data_Row, data_Column;
data_Row = a.getRowCount();
data_Column = a.getColumnCount();
これでデータ数が取得できたので,先程の時間や姿勢角の配列の要素数を定義します.
Time = new float[data_Row];
Phi = new float[data_Row];
Theta = new float[data_Row];
Psi = new float[data_Row];
あとは,この変数の各要素にcsvファイル内のデータを振り分ければ読み込み完了です.
データの振り分けは以下のようなプログラムで実行可能です.
for (int i = data_Row - 1; i >= 0; i--)
{
Time[i] = a.getFloat(i, 0);
Phi[i] = a.getFloat(i, 1);
Theta[i] = a.getFloat(i, 2);
Psi[i] = a.getFloat(i, 3);
}
まとめ
最後に,これまでのプログラムを一つにまとめたものを以下に示します.
Table a;
float[] Time, Phi, Theta, Psi;
int data_Row, data_Column;
setup(){
a = loadTable(filename);
data_Row = a.getRowCount();
data_Column = a.getColumnCount();
Time = new float[data_Row];
Phi = new float[data_Row];
Theta = new float[data_Row];
Psi = new float[data_Row];
for (int i = data_Row - 1; i >= 0; i--)
{
Time[i] = a.getFloat(i, 0);
Phi[i] = a.getFloat(i, 1);
Theta[i] = a.getFloat(i, 2);
Psi[i] = a.getFloat(i, 3);
}
}
以上のようなプログラムを実行することで,Processingでcsvファイルを読み込み,変数にデータを振り分けることができます.
ここで得られたデータを使えば,グラフを作ったり,アニメーションを作ったりできます.
続けて読む
この記事で解説したcsvデータをProcessingで読み込むと,データをグラフなどのアニメーションに利用することができます.
以下の記事ではデータを時系列グラフにする方法を解説しています.
興味のある方は参考にしてください.
Twitterでは記事の更新情報や活動の進捗などをつぶやいているので気が向いたらフォローしてください.
それでは最後まで読んでいただきありがとうございました.
コメント
[…] Processingでcsvファイルを読み込む方法 […]