- PR -

CSVファイルから折れ線グラフを作るには

投稿者投稿内容
shu
会議室デビュー日: 2004/12/02
投稿数: 11
投稿日時: 2004-12-06 10:05
shuと申します.
お世話になります.

件名の通りcsvファイルから折れ線グラフを作成したいと考えています.
csvファイルは2列で月と気温が一対になっている簡単なものです.

FileReaderクラスとBufferedReaderクラスでcsvファイルは読み込めます.
しかしグラフを作る際に用いるXYSeriesクラスでは
addメソッドでadd(double,double)のようにdouble型の変数を引数にとっています.

よって思うにファイルを読み込んだときのString型変数を
double型変換する必要があるように考えています.

また例では月と気温でしたので12対のデータですが
実際には日,つまり365対のデータや1日における分,つまり1440対のデータを
使って折れ線グラフを描こうとしているため
配列を用いた変数代入をするほうがよいと考えています.

そこで以下2点について質問させてください.

○FileReaderクラス/BufferedReaderクラスで読み込んだcsvファイル(String型)を
 double型の変数に変換するにはどのような方法が考えられるか?
○大量のデータ対を効率よく代入するためにどのような方法で配列に収めることが
 考えられるか?

もしも解決法やヒントについてご存知の方がいらっしゃれば
お手数ですが教えていただけませんでしょうか?

よろしくお願いいたします.

Cluster
ぬし
会議室デビュー日: 2003/03/06
投稿数: 289
お住まい・勤務地: 大阪
投稿日時: 2004-12-06 10:38
引用:

shuさんの書き込み (2004-12-06 10:05) より:

○FileReaderクラス/BufferedReaderクラスで読み込んだcsvファイル(String型)を
 double型の変数に変換するにはどのような方法が考えられるか?




Doubleクラスを使えばいいだけでは?
詳しくはJ2SEのJAVADocをどうぞ。
http://java.sun.com/j2se/1.4/ja/docs/ja/api/java/lang/Double.html
n.w
大ベテラン
会議室デビュー日: 2003/07/15
投稿数: 126
お住まい・勤務地: 神奈川
投稿日時: 2004-12-06 11:15
Cluster様の仰るようにDoubleクラスのparseDoubleで変換し
配列ならループで配列のlength分まわせばいいかと。
今後システム全体で同様の処理が発生すると思いますし、共通クラス
でString配列をDouble配列へ変換又は、String配列を
XYSeriesクラスへaddしてやるメソッドがあると便利かもしれませんね
コード:
double[] addData = new double[csvData.length];
for(int i=0; i<csvData.length; i++){
   addData[i] = Double.parseDouble(csvData[i]);
}


↑にNULL、数字以外の文字列がきた場合も考慮しないと
こけますが

かつのり
ぬし
会議室デビュー日: 2004/03/18
投稿数: 2015
お住まい・勤務地: 札幌
投稿日時: 2004-12-06 11:28
引用:

○大量のデータ対を効率よく代入するためにどのような方法で配列に収めることが
 考えられるか?


CSVに拘らないのであれば、データ作成側でdoubleの配列を
直列化するって手も有りますよ。これなら一瞬です。

他のプログラムとのインターフェイス上無理なら仕方がないですが、
データ入力部に改善の余地があれば、考えてみてはいかがですか?
takamaro
大ベテラン
会議室デビュー日: 2004/10/12
投稿数: 100
投稿日時: 2004-12-06 11:38
引用:

○大量のデータ対を効率よく代入するためにどのような方法で配列に収めることが考えられるか?



BufferedReaderを用いてCSVファイルからdouble型の配列に代入するんですよね?
月毎なら

コード:

double[] month = new double[12];
while(bufferedreader.ready()){
    String[] data = (bufferdreader.readLine()).split(",",2);
    month[Integer.parseInt(data[0])-1] = Double.parseDouble(data[1]);
}


ってな感じで配列の添え字を「月」に、値を「気温」にすれば宜しいのではないかと。
(上記のソースはCSV形式ファイルが完全であるという前提ですので、実際に用いる
時には、チェック処理を付加してください)
shu
会議室デビュー日: 2004/12/02
投稿数: 11
投稿日時: 2004-12-06 19:06
Cluster様 n・w様 takamaro様 返信ありがとうございます.

取り急ぎお礼のメールと以下の
以下のコードを作成したにも関わらず未だうまくいっていませんので
よろしければご助言いただければと再び掲示板に載せました.

何でも教えてくださいの姿勢はよろしくないことは
重々承知しておるつもりですが時間や技量など考えてると
お聞きしたヒントをもとに考えたほうが望ましいと思い書き込みをしました.

以下のコードはjButton1を押すとグラフが現れるということを
意図して作成いたしました.
なおJBuilderを用いておりますのでデフォルトはできあがっております.

また下記コードのうちXYSeriesクラス以下はまだ未検討で
その上の部分,つまりcsvファイルから読み込んだBufferedReaderクラスのdisを
Stringクラスのsに変換する部分で既につまづいてしまっています.
JBuilderのパネルに")"が足りないといった表示がなされます.
自分でもString sのところが! = nullまで繰り返すわけなので
while文などを用いる必要があることは何となく思うのですが
その下にfor文もあるのでどのように書くのかが分かりません.

どなたかヒントやご助言いただけますようお願いいたします.
よろしくお願いいたします.


[code]

String file = "C:\\Documents and Settings\\*****\\**.csv"
private jButton jButton1 = new JButton();

private void jButton1_actionPerformed(java.awt.event.ActionEvent evt) {
try {
FileReader fis = new FileReader(file);
BufferedReader dis new BufferedReader(fis);

String s = (dis.readLine() ! = null);
double[] addData = new double[s.length];
for (int i =0; i < s.length; i++) {
addData[i] = Double.parseDouble(s[i]);
}

dis.close();
fis.close();

} catch (IOException e) {
e.printStackTrace();
}

XYSeries a = new XYSeries("気温");

int[] mounth = {1,2,3,4,5,6,7,8,9,10,11,12};
for (int i = 0; i < mounth.length; i++) {
a.add(mounth[i],addData[i]);
}

XYSeriesCollection dataset = new XYSeriesCollection();
dataset.addSeries(a);

JFreeChart chart =
ChartFactory.createXYLineChart(
"気温",
"月",
"気温",
dataset,
PlotOrientation.VERTICAL,
true,
true,
false);

this.setContentPane(new ChartPanel(chart));
this.show();
Edosson
ぬし
会議室デビュー日: 2004/04/30
投稿数: 675
投稿日時: 2004-12-07 16:25
コンパイラを通らないソースを貼り付けても、
デバッグを引き受けてくれるような人はいないと思いますよ。

プログラミングの基本は、まずは動くものを作り、そして、それをいじくる、です。
最初から、目的通りのものががしがし書けるなんてことは、
雲の上の人に任せておきましょう。

1.テスト用に、10件程度のデータファイルを用意する。
2.ファイルを開き、データを1行ずつ読み込み、クローズできるようにする。
3.読み込んだ1行を、必要な形に分割し、String配列に格納できるようにする。
4.String配列を、目的の型の配列に変換する。
5.生成した配列を、グラフィック・オブジェクトに飲ませて、グラフを表示できるようにする。
6.データファイルを本番のものにする。

こんなところでしょうか。
肝心なことは、「1度に対処するのはひとつだけ」ということです。

「'('が足りない」とか「ファイルを読ませるのにループをどう使うか」とか、
いくつか問題をあげていらっしゃいますが、いずれにせよ、
ひとつずつ対処していくしかありません。

がんばってください。
n.w
大ベテラン
会議室デビュー日: 2003/07/15
投稿数: 126
お住まい・勤務地: 神奈川
投稿日時: 2004-12-07 16:40
Edosson様より指摘はありましたが
まずJFreeChartでグラフ作成はおいといて、ファイル読み込み処理
だけ作ってみた方がいいと思います。
その中でひとつずつ解決してくのがいいかと。

その後値が正常に取れること確認できたらグラフ作成に入ってみては?
とりあえずFile操作こんな感じの使い方かと
コード:

String file =
"C:\\Documents and Settings\\*****\\**.csv";
private JButton jButton1 = new JButton();

private void jButton1_actionPerformed(java.awt.event.ActionEvent evt) {
try {
FileReader fis = new FileReader(file);
BufferedReader dis = new BufferedReader(fis);

//ファイルからデータを読み込める間繰り返す
while( dis.ready() ){
System.out.println( dis.readLine() ); //1行読み込んで表示する
}

dis.close();
fis.close();

} catch (IOException e) {
e.printStackTrace();
}
}


そのままそちらのほしい処理にはなってませんが、サンプルって
事であとは自分用に解読しながらいじってみてください。


[ メッセージ編集済み 編集者: n.w 編集日時 2004-12-07 16:44 ]

スキルアップ/キャリアアップ(JOB@IT)