- PR -

csvファイルを読み込んで配列に格納し使用する方法について

投稿者投稿内容
shu
会議室デビュー日: 2004/12/02
投稿数: 11
投稿日時: 2005-03-02 23:15
こんにちは。
参考書をいくつかやりながら
自分に興味あるプログラムを書いて
javaを学習しています。

その過程でcsvファイルを配列に読み込んで
その配列を使ったグラフ作成や
配列中で条件に該当する数値の個数や平均値を求める
プログラムを作成しています。

for文で配列に読み込んだのですが
for文の中でshow()など使うと表示が繰り返しになるので
変数をstaticにして外に出してしまいました。
ところが今度は配列に読み込んだ気配がありません。

ずっと考えているのですが解決ができなかったので
書き込みをさせていただきました。
皆様のお知恵をお貸しくださいませ。
よろしくお願いいたします。

下はプログラムの一部です。
for文内で配列ddおよびtimeにcsvファイルのデータを読み込んでいます。
例えば読み込んだ配列の中で5より大の数値の個数や
その平均値などを求めたりしたいと思っています。

public class getData {

static String file = "xxxxxx";
static File Datafile = new File(file);
static int fileSize = (int)Datafile.length();
static int i;
static double dd[] = new double[fileSize];
static double time[] = new double[fileSize];

public static void main(String[] args) {

try{
BufferedReader br = new BufferedReader(new FileReader(Datafile));
String row1 = null;
String row2 = null;
for (i = 0; i < dd.length; i++) {
String line = br.readLine();
StringTokenizer st = new StringTokenizer(line, ",");
while (st.hasMoreTokens()) {
row1 = st.nextToken();
row2 = st.nextToken();
}

time[i] = Double.parseDouble(row1);
dd[i] = Double.parseDouble(row2);

}
K
大ベテラン
会議室デビュー日: 2004/04/07
投稿数: 174
投稿日時: 2005-03-03 00:08
コードがかなりすごいことになってますね。

BufferedReaderやFileクラスの使い方について理解する段階まで至っていないように思います。

おそらくクラスとインスタンスの関係や変数のスコープの問題など基本的な部分を
理解していないと思うので、まずはそのあたりをちゃんと勉強してみてください。

ibara
常連さん
会議室デビュー日: 2002/11/15
投稿数: 26
投稿日時: 2005-03-03 01:35
こんにちは。

> for文の中でshow()など使うと表示が繰り返しになるので
show()って何ですか?表示ってなんですか?

>ところが今度は配列に読み込んだ気配がありません。
なぜそう思ったのですか?
具体的にはどういう現象を根拠として「読み込んだ気配がない」と判断されましたか?

そこをきちんと書いていただければよいアドバイスがもらえると思います。

コードの不足部分を補って実行してみましたが、配列にはちゃんと格納されますよ。でもNullPointerで落ちます。
なぜfileSizeを配列のサイズに使っているのでしょうか?

[ メッセージ編集済み 編集者: ibara 編集日時 2005-03-03 01:36 ]
山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2005-03-03 04:42
>ずっと考えているのですが解決ができなかったので
結局なにがわからないのでしょう?コードや質問を見ても、具体的に何を聞きたいのか把握できませんでした。
もう少し整理してみて問題を絞ってはいかがでしょう。
takamaro
大ベテラン
会議室デビュー日: 2004/10/12
投稿数: 100
投稿日時: 2005-03-03 08:44
前にも書きましたが、shuさんのプログラミング習得方法は駄目なやり方です。
「とにかく初心者はプログラムを書いて覚えろ」って、確かに真理であり鉄則なん
ですが「理解できていない事を理解せずに書く」を繰返しても腕は上達しません。
配列の使い方の手順を理解しているからといって、何でも無暗に配列に突っ込もうと
したって上手くいくはずなんかありません。
サイズが不定な要素を保持する為には別の方法があります(可変長配列で検索!)
そんな事は大概の初心者向けの本には必ず書いてある事ですので、shuさんがそれを
理解していないと言う事は入門書を読み通していない事の証明に他なりません。
私も含め、アドバイスに対し「厳しい事ばかり言うなよ」と思われるやもしれませんが、
コードを見れば大凡の記述者の現状って見えてくるものなんです。
例えばフィールド全てがstaticになってれば「あぁ、コンパイラに叱られたから
その場凌ぎで意味も分からずにstatic付けちゃったんだな」とか「決してこの人は
動作確認の為の小さなプログラムなんぞ書いちゃいないんだろうな」とか。
で、そんなんじゃ絶対上手くはいかないし、万一偶然に動いたとしても再度同じもの
を再現する事すら無理だろう、と誰もが思うわけですよ。このコードをみてしまうと。
入門書は一通り目を通すこと。億劫がらず動作確認プログラムを書くこと。知らない
用語が出てきたら検索すること。以上はプログラミングの上達を望むなら必須です。
私のハードディスクにある「*.java」ファイルの8割は動作確認用に書いたプログラム
だったりします。プログラムを書くって事はそういうことなんです。
好き嫌いせず、億劫でも一歩ずつ確実に前進しながら習得していって下さい。
未記入
会議室デビュー日: 2005/03/03
投稿数: 9
投稿日時: 2005-03-03 13:02
今までこちらやJava普及委員会のログにずいぶんお世話になっているのですが、投稿は初めてです。

仕事でJavaをやる必要があり、プログラム経験が皆無の状態から初めて1ヵ月半程度の私がこのような書き込みをするのは、失礼かもしれませんが一言。

shuさんは以前同じ様な内容の投稿をされ、解決されたのではないでしょうか?
そのときの内容もCSVファイルを読み込む動作はあったと記憶しています。
そしてインギさん、takamaroさん等のアドバイスを受け、動作できるようになったと書き込みされていたと思います。
失礼ながら、今回の質問内容は以前質問されたときのコードが問題なく動いているならば、それを見返せば十分解決できるものと思います。

私もshuさんと同じようなコードをいきなり作成することになり、本を読んだりこちらや他の掲示板、Java講座のページなどを見て何とかできるようになりました。
現在は別な問題に直面していますが(汗

もし解らないのであれば、他の方が仰っている通り問題を細分化して一つずつサンプルを作成していく。
それでも解らなければ質問する。
という方式をとられてはいかがでしょう?

ひょっとしてshuさんは「今この処理がやりたいからそれだけが出来ればいい」というような性格の方なのでしょうか?
それは数時間前までの私と同じですw
awtをちゃんと理解していないのにswingをやろうとしましたから

とりあえず、CSVファイルを一行ずつ読み込んで、コマンドプロンプト上で表示させるところからはじめてはいかがでしょう?

初心者かつ若輩者の私ですので、失礼な文言等あったかとは思いますが、おそらくほぼ同じレベルにいるであろう者からの言葉として、頭の片隅にでもとどめていただければと思います。
shu
会議室デビュー日: 2004/12/02
投稿数: 11
投稿日時: 2005-03-03 19:30
皆様ありがとうございます。

shuさんは以前同じ様な内容の投稿をされ、解決されたのではないでしょうか?

確かに解決したんです。
ただやはり付け焼刃だったのです。
本質的理解とはまったく別物だったのです。

public class bbb {
static int a[] = {1,2,3,4,5,6,7};
static int d;
static int i;
public static void main(String[] args) {

for (i = 0; i < a.length; i++){
if(a[i] > 5){
d = d + a[i];
}
}
System.out.println(d);
}
}
これは単に配列aのうち5より大の数の和を求めています。
for文内で配列a[i]が5より大ならばdに代入、そしてdはクラスフィールドだから
for文の外からでも参照できる。
これをcsvファイルからもやろうと考えました。
意図はfor文の外で配列の数値を操作したかったから。
とりあえず表示できるかどうかを
for文の内と外両方に
System.out.println(time[i]);として確認。
内のほうはできて、外はまったく表示されず。
もちろんfor内のコードを消しても同じ結果。
わかったことは全てがわかっていなかったということです。

ひょっとしてshuさんは「今この処理がやりたいからそれだけが出来ればいい」というような性格の方なのでしょうか?

まぁそうですね。
プログラムを生業としていませんが
できると楽しそうなので趣味でやっています。
よって何か役に立ちそうなコードを見るとすぐにやってみたくなる。
分からないから本やネットで調べる。
基本がないことに気づき、地道にやるが、またいじってみたくなる。
こんな感じです(ダメですね)。

初心者かつ若輩者の私ですので、失礼な文言等あったかとは思いますが、おそらくほぼ同じレベルにいるであろう者からの言葉として、頭の片隅にでもとどめていただければと思います。

私は初心者以下ですので失礼でも何でもないです。
クラス、インスタンス、コンストラクタ…分かっていません。

この前もクラスはフィールドとメソッドを持っているとのことだから
あるクラスAにフィールドbと、bを引数にしたメソッドcを考えて
さらにcによって演算された値dを引数にしたメソッドeを考えて…とすれば
エクセルマクロみたいな自動処理ができるんでは、と考え実行、即失敗。

まぁこんな調子で全く分かっていないのです。
勉強がたりません。
皆様お時間をとっていただきありがとうございました。
uk
ぬし
会議室デビュー日: 2003/05/20
投稿数: 1155
お住まい・勤務地: 東京都
投稿日時: 2005-03-03 21:21
引用:

shuさんの書き込み (2005-03-03 19:30) より:
クラス、インスタンス、コンストラクタ…分かっていません。


まず、shuさんが書かれているプログラムのレベルでは、クラスもインスタンスもコンストラクタも
理解している必要はありません。

引用:

for文内で配列a[i]が5より大ならばdに代入、そしてdはクラスフィールドだから
for文の外からでも参照できる。


クラスフィールドにする必要はなく、ローカル変数で十分です。なぜクラスフィールドにしないと
for文の外では参照できないと思われたのでしょうか。

引用:

for文の内と外両方に
System.out.println(time[i]);として確認。
内のほうはできて、外はまったく表示されず。


iが変数であるということを理解していますか? 変数と言うことは、値が変化しているということです。
for文の中と外でiの値が何になっているかを確認してください。そうすれば何を勘違いしているのか
わかると思います。

やはり基本的なところからきちんと学習すべきではないか、とは私も思います。

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