- PR -

ファイルの総行数の取得方法

投稿者投稿内容
モンプチ
常連さん
会議室デビュー日: 2004/06/03
投稿数: 28
投稿日時: 2004-06-07 22:05
すみません、御教授願います。

今以下の事を行おうとしています。
・CSVファイルを読み込む
・特定列の値を配列に代入する

これを実現する方法で、以下がわかりません。
・CSVファイルの総行数の取得方法

総行数を得るには、1回FileInputStreamで全行回すしかないのでしょうか?
配列を無駄なく使うために、まず総行数を取得してから、FileInputStreamを使いたいのですが、よい方法はないのでしょうか?



koe
大ベテラン
会議室デビュー日: 2003/07/13
投稿数: 198
投稿日時: 2004-06-07 23:00
引用:

モンプチさんの書き込み (2004-06-07 22:05) より:
今以下の事を行おうとしています。
・CSVファイルを読み込む
・特定列の値を配列に代入する


java.util.ArrayList使いましょう。
Stringオブジェクトを入れたArrayListから配列を取得する場合は
以下のコードでできます。
コード:
ArrayList list = new ArrayList();
list.add("foo");
list.add("bar");
list.add("buz");
String[] array = (String[])list.toArray(new String[list.size()]);

MMX
ぬし
会議室デビュー日: 2001/10/26
投稿数: 861
投稿日時: 2004-06-07 23:00
>配列を無駄なく使う
サイズ可変な コンテナクラスを探しましょういろいろあります。
Cluster
ぬし
会議室デビュー日: 2003/03/06
投稿数: 289
お住まい・勤務地: 大阪
投稿日時: 2004-06-07 23:01
答えにはなってませんが
引用:

モンプチさんの書き込み (2004-06-07 22:05) より:

これを実現する方法で、以下がわかりません。
・CSVファイルの総行数の取得方法

総行数を得るには、1回FileInputStreamで全行回すしかないのでしょうか?




私の知る限りでは、他の方法はないですね・・・。
(かなり乏しい知識ですが

引用:

モンプチさんの書き込み (2004-06-07 22:05) より:

配列を無駄なく使うために、まず総行数を取得してから、FileInputStreamを使いたいのですが、よい方法はないのでしょうか?




もしかして、「はじめにかなり多めの要素数の配列を宣言しておく」みたいなことを
考えられているのでしょうか?
であれば、ArrayListとかを使って一旦格納しておいて、全部読み込み終わってから
ArrayListを配列に変換すれば、無駄に大きい配列を作る必要はなくなりますが。

#外してたらごめんなさい。 m(__)m

<追記>
かぶりまくり・・・ (^^)

[ メッセージ編集済み 編集者: Cluster 編集日時 2004-06-07 23:04 ]
モンプチ
常連さん
会議室デビュー日: 2004/06/03
投稿数: 28
投稿日時: 2004-06-08 00:14
koe様、MMX様、Cluster様、御返事有難う御座います。

取り急ぎですが、御礼言わせてください。
早速アドバイスを踏まえて、やってみます。

解決致しましたら、再度書き込みさせて頂きます。

かずくん
ぬし
会議室デビュー日: 2003/01/08
投稿数: 759
お住まい・勤務地: 太陽系第三惑星
投稿日時: 2004-06-08 09:16
各列の要素サイズが固定、すなわち、各行のデータサイズが同じCSVなら、(一行のサイズ) * (インデックス)で、データを取り出すことは可能でしょう。

各行のサイズが固定で無いCSVの場合は、一度すべて読み込んでからとなるでしょう。

ファイルサイズがどの程度かはわかりませんが、数KB程度なら、read-bufferの関係上、一度に読み込んだほうが効率的です。数MBに及ぶのであれば、検索効率に優れた構造で永続化するかまたは、DBの検討を行うべきだと思います。
モンプチ
常連さん
会議室デビュー日: 2004/06/03
投稿数: 28
投稿日時: 2004-06-08 15:48
「かずくん」様、御返事有難う御座います。

すみません、再度お助け願います。
CSVファイルの読込後、列毎に代入する際、以下の事が対処できません。
・列値が、null

以下のソースですと、エラーになります(値がnullの配列参照するため)

ArrayList alList_Area_Area = new ArrayList();
ArrayList alList_Area_Town = new ArrayList();
ArrayList alList_Area_Code = new ArrayList();
ArrayList alList_Area_Per = new ArrayList();

// 1行毎に読み込んで処理
while ((line=reader.readLine()) != null)
{
line = (line + ",");
System.out.println(line);

// 区切り記号を指定(「,」)
String[] csv = line.split(",");

// ArrayListに代入
alList_Area_Area.add(csv[0]);
alList_Area_Town.add(csv[1]);
alList_Area_Code.add((csv[2]+ csv[3]));
alList_Area_Per.add(csv[6]); // ここがnull値が多い(最終列)
}

「,」区切りにするため、「java.util.regex.split」は使用したいのですが、そうなると配列を使う方法しかわかりません。
「java.util.StringTokenizer」を使用すると、順にしか読み込みができない?ので使用したくないのです。

申し訳ありません。
再度、御迷惑お掛けしますが、御教授願います。
msz193
会議室デビュー日: 2003/11/10
投稿数: 6
投稿日時: 2004-06-08 17:35
はじめまして。
的外れでしたらごめんなさい。

こんな感じのメソッドをかませば良いのでは?
でなくて?

private nvlString(String value) {
return (null==value)?"":value;
}

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