2017-06-07 10 views
0

さまざまなデータタイプのCSVファイルを読み込もうとしています。Java - さまざまなデータタイプのCSVファイルを読み込む最も効率的な方法

シートの行は以下のようになります:

シングル、毎月、加速、ジョン・スミス、1951年8月15日、はい

私はその後に、各フィールドを割り当てる必要があります変数名、いくつかの計算をプリフォーム出力を印刷してから現在まで、Excelシートに次の行に

を移動し、私は以下の

ArrayList<String> lines = new ArrayList<>(); 
try { 
    BufferedReader reader = new BufferedReader(new FileReader(fileName)); 
    String line = null; 
    while ((line = reader.readLine()) != null) { 
     lines.add(line); 
     } 
を使用してきました

しかし、これは、対応するExcelの行のテキスト(カンマを含む)を含む長い文字列を含む各スロットを持つ配列を作成します。 これは、値を抽出するために各スロット/文字列をトラバースする必要があるため、非効率的で実用的ではないようです。私は方法論を持っていたら

は、私はすべての問題のコードを書くことを持って文句を言わないが、私はそれ

が、それは別に、各セルを読み込み、変数に割り当てた方が良いです行くための最善の方法を知らないのですか? また、ファイルを一度読み込んで後でそれを走査する方が良いでしょうか? おそらく、この作業を行うより効率的な方法があります。

編集:私はCSVファイル全体を2次元配列として読み込もうとしますが、異なるデータ型が問題になる可能性があります。

答えて

0

このようなことを試すことができます。 StringTokenizerを使用して、コンマで行を分割し、各反復で文字列として別のリストにそれらの要素を追加します。

ArrayList<ArrayList<String>> lines = new ArrayList<>(); 
try { 
    BufferedReader reader = new BufferedReader(new FileReader(fileName)); 
    String line = null; 
    while ((line = reader.readLine()) != null) { 
     ArrayList<String> tokens = new ArrayList<>(); 
     StringTokenizer st = new StringTokenizer(line, ","); 
     while (st2.hasMoreElements()) { 
      tokens.add(st2.nextElement()); 
     } 
     lines.add(tokens); 
    } 
} 

ここで、適切なキャストを使用して、必要なタイプに変換できます。たとえば、日付を取得するには、

DateFormat format = new SimpleDateFormat("mm/dd/yyyy", Locale.ENGLISH); 
String dateString = lines.get(0).get(5); 
Date date = format.parse(dateString); 
+0

これはおかげで、私のために働くことができました。 StringTokenizerが良い選択だと思った特別な理由はありますか?私が尋ねる理由は、java docの状態です:** StringTokenizerは互換性のために保持されているレガシークラスですが、その使用は新しいコードでは推奨されません。この機能を求める人は、splitメソッド(Stringまたはjava.util.regexパッケージ)を使用することをお勧めします。** – Kevin

+0

[この質問](https://stackoverflow.com/q/6983856/4310386 )。多くの方法があるので、分割を行う方法を選択することができます。それはあなた次第です。 –

0

行を保存する必要はありません。代わりに、各行を表すクラスを作成し、リストに追加します。

のようなもの:あなたは任意のアクセス修飾子なしでそれらを保つか、それらをプライベートにとgetter/setterを追加することができ

class MyData 
{ 
    String status; 
    String salary; 
    String accelerated; 
    String firstName; 
    String lastName; 
    String date; 
    String trueOrFalse; 

} 

を。あなただけのいくつかの計算を実行したい場合は、ファイルのリーダーで

は、デフォルトではコンマ(,

ArrayList<MyData> datas = new ArrayList<MyData>(); 
while ((line = reader.readLine()) != null) { 
     String[] columns = line.split(","); 
     MyData data = new MyData(); 
     data.status = columns[0]; 
     data.salary = columns[1]; 
     . 
     . 
     data.trueOrFalse = columns[6]; 
     datas.add(data); 
     } 

OR

あるCSVで使用される区切りを使用して行を分割し、別のクラス、またはArrayList<String> linesの必要はありません。

ちょうど行いません:

while ((line = reader.readLine()) != null) { 
     String[] columns = line.split(","); 
     // Perform calculations with columns 
     // Print. 
} 

その場合は情報を格納する必要が。

関連する問題