ログインしてさらにmixiを楽しもう

コメントを投稿して情報交換!
更新通知を受け取って、最新情報をゲット!

Javaの課題丸投げコミュのcsvファイルのデータを二次元配列に保持する方法

  • mixiチェック
  • このエントリーをはてなブックマークに追加
こんにちは。度々お世話になっております。

約100行400列の数値データを加工するため、csvファイルから読み込んで二次元配列に保持したいと考えております。

大分調べたつもりなのですが、どの方法も今ひとつうまくいかない+理解できないで困っています。唯一読み込めたのは次のURLにあるライブラリでしたが、読み込みに20~30分程度かかるので残念ながら使用に耐えません。

http://digitechlog.com/2008/12/01/how-to-read-and-write-micorsoft-excel-csv-file-with-bufferedreader-filereader-class-in-java.html

 (ちなみに処理データは数100個ほどあります。処理ルーチンは完成していまして、連続読み込み->処理ができるところまで検証は済んでいます。)

どうかよろしくお願いします。

コメント(4)

このライブラリはメモリ上に全部読み込むくせに特定の値を読むのに毎回パースしてるのでいけてないですね
部品としてはつかえるのでは?
早速のお答えありがとうございます。
部品として、ですね。当方、初心者で理解できるか解りませんが、コードをよんでみます。
とりあえずの手で自己解決しましたので報告します。

幸い、項目間のデータ数のバラツキはない矩形のデータでしたので、まずファイルをさぐって縦横数を取り出しました。そうして、行ごとにsplitして別途用意した配列に順番に入れる、と、こんなところでしょうか。

3回もファイルを読みに行っていて恥ずかしいコードですが、次の通りです。


import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.LineNumberReader;

public class CopyOfCSVtest4 {

public static void main(String[] args) {

/*
* 行・列数読み込み
*/
int l = 0, m = 0;
BufferedReader br;
try {
LineNumberReader ln
= new LineNumberReader
(new FileReader("test.csv"));
String aLine;
while(null != (aLine = ln.readLine())){
;
}
l = ln.getLineNumber();
ln.close();

br = new BufferedReader
(new FileReader("test.csv"));
String s = br.readLine();
String[] sp = s.split("," , 0);
m = sp.length;
br.close();
} catch (FileNotFoundException e1) {
e1.printStackTrace();
} catch (IOException e1) {
e1.printStackTrace();
}

/*
* リスト展開
*/

String[][] item = new String[l][m];
System.out.println(l +", "+ m);

try {
br = new BufferedReader
(new FileReader("test.csv"));
String[] row;
String line;
for (int i = 0; i < l; i++){
line = br.readLine();
row = line.split(",", 0);
for (int j = 0; j < m; j++){
item[i][j] = row[j];
}
}
br.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
//テスト表示
System.out.println(item[0][359]);
System.out.println(item[87][359]);

}
}
環境書いてないけどscanner。
配列に入れるということは全部メモリに置くということなので、そこがネックならこれも遅いかも。

import java.util.Scanner;
import java.util.List;
import java.util.ArrayList;
import java.io.File;
import java.io.IOException;

public class Sample{
public static void main(String[] args){
Sample sample = new Sample();
sample.run();
}
public void run(){
List<List<String>> csv = parse(file());
System.out.println(csv);
convert(csv);
}
public Scanner file(){
Scanner file = null;
try{
file = new Scanner(new File("/tmp/sample.csv"));
}catch(IOException e){
e.printStackTrace();
}
return file;
}
public Scanner string(){
return new Scanner("1,2,3,4,5\n6,7,8,9,10\n");
}
public List<List<String>> parse(Scanner in){
in.useDelimiter(System.getProperty("line.separator"));
List out = new ArrayList();
while(in.hasNext()){
String line = in.next();
Scanner inRow = new Scanner(line).useDelimiter(",");
List outRow = new ArrayList();
while(inRow.hasNext()){
outRow.add(inRow.next());
}
out.add(outRow);
}
return out;
}
public String[][] convert(List<List<String>> dim2){
String[][] array = new String[dim2.size()][];
int dim2index = 0;
for(List<String> dim1:dim2){
array[dim2index] = new String[dim1.size()];
int dim1index = 0;
for(String value:dim1){
array[dim2index][dim1index++] = value;
}
dim2index++;
}
return array;
}
}

ログインすると、みんなのコメントがもっと見れるよ

mixiユーザー
ログインしてコメントしよう!

Javaの課題丸投げ 更新情報

Javaの課題丸投げのメンバーはこんなコミュニティにも参加しています

星印の数は、共通して参加しているメンバーが多いほど増えます。

人気コミュニティランキング