2011-06-29 18 views
6

Javaプログラム内で使用できる配列にCSVファイルをインポートしようとしています。 CSVファイルが正常にインポートされ、端末に出力が表示されますが、エラーがスローされます:CSVからJavaの配列へのデータの解析

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 1 
at CompareCSV.main(CompareCSV.java:19) 

最後にエラーがスローされます。また、配列内の要素を呼び出そうとすると、同じエラーが表示されます。私のコードは以下の通りです:

import java.io.*; 
import java.util.*; 

public class CompareCSV { 

    public static void main(String[] args) { 

     String fileName = "sampledata1.csv"; 
     try { 
      BufferedReader br = new BufferedReader(new FileReader(fileName)); 
      String strLine = null; 
      StringTokenizer st = null; 
      int lineNumber = 0, tokenNumber = 0; 

      while((fileName = br.readLine()) != null) { 
       lineNumber++; 
       String[] result = fileName.split(","); 
       for (int x=0; x<result.length; x++) { 
        System.out.println(result[x]); 
       } 
      } 
     } 

     catch (FileNotFoundException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
} 
+2

結果のサイズではなく、forループでハードコーディングされた定数を使用しているのはなぜですか? – Perception

+0

既存のJava CSV APIを必要に応じて使用することができます(http://sourceforge.net/projects/csv4j/またはhttp://sourceforge.net/projects/javacsv/など)。 –

+0

@Perceptionは正しいです、行を読んだ後に3つの値があるでしょうか? – Marcelo

答えて

6

あなた自身まで障害のあるものをハッキングより適切なCSVパーサーを使用してオフにはるかに優れている:http://opencsv.sourceforge.net/

CSVは、1が(そう考えるようにしましょうことがあり、単純な形式ではありません1行に2つのデータを区切らない,を含めることができます)。

+0

Javaプログラムにopencsvパッケージをどのように呼びますか?私は以前にそれを実装しようとしていたし、何とか正しいものになっていないようです。 編集:/ examplesディレクトリが見つかりました。 –

+0

"csv4j"ライブラリを使用せずにシンプルなcsvファイルを解析できるはずです... –

+0

インターネット上の他の読み取りでは、CSVライブラリを取得する方が簡単かもしれないことが示されています。しかし、はい、シンプルなCSVファイルを他のJavaプログラムからアクセスできる配列に簡単にパースする方法を知っていれば、私は大いに感謝しています! –

0

ファイルの中の1行が常にの3つの列を持つことは、すべての行に当てはまるとは思われません。それが起こった理由は、例外を排除し、確認するために以下の行をループ文に置き換えます

for (int x=0; x<result.length; x++) 
2

これは、上記の質問

public class Readline { 

/** 
* @param args 
*/ 
public static void main(String[] args) { 
    String fileName = "C:/Users/karthikrao/Desktop/cvsFile.csv"; 
    ArrayList<Integer> margins = new ArrayList<Integer>(); 
    BufferedReader br; 
    String line, token; 
    int i; 
    try { 
     br = new BufferedReader(new FileReader(fileName)); 
     try { 
      while ((line = br.readLine()) != null) { 
       StringTokenizer st = new StringTokenizer(line, ",\""); 
       i = 0; 
       while (st.hasMoreTokens()) { 
        token = st.nextToken(); 
        if (margins.size() <= i) { 
         margins.add((Integer) token.length()); 
        } else { 
         margins.set(
           i, 
           Math.max(margins.get(i), 
             (Integer) token.length())); 
        } 
        i++; 
       } 
      } 

      br = new BufferedReader(new FileReader(fileName)); 
      while ((line = br.readLine()) != null) { 
       StringTokenizer st = new StringTokenizer(line, ",\""); 
       i = 0; 
       while (st.hasMoreTokens()) { 
        token = st.nextToken(); 
        System.out.print(token); 
        for (int j = 0; j < margins.get(i) - token.length(); j++) { 
         System.out.print(" "); 
        } 
        System.out.print("|"); 
        i++; 
       } 
       System.out.println(); 
      } 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } catch (FileNotFoundException e) { 
     e.printStackTrace(); 
    } 

} 

}

2

のための答えである私はあなたをしませ示唆非常に多くの偉大な図書館があるときには、再び発明することができます。参考として、次のコードsnipptとuniVocity-parsersを試してみてください:

public static void main(String[] args) throws FileNotFoundException { 

    /** 
    * --------------------------------------- 
    * Read CSV rows into 2-dimensional array 
    * --------------------------------------- 
    */ 

    // 1st, creates a CSV parser with the configs 
    CsvParser parser = new CsvParser(new CsvParserSettings()); 

    // 2nd, parses all rows from the CSV file into a 2-dimensional array 
    List<String[]> resolvedData = parser.parseAll(new FileReader("/examples/example.csv")); 

    // 3rd, process the 2-dimensional array with business logic 
    // ...... 
} 

あなたが見ることができるように、配列にCSVデータを解析するのタスクを完了するために必要な唯一の2行。さらに、このライブラリは、優れたパフォーマンスでCSVデータを解析する機能の完全なリストを提供します。

関連する問題