2016-04-12 6 views
2

私はCSVファイルを読み込み、各区切り要素を2次元配列にしています。これは、このように読まれているファイルの2/2であるので、それは、この特定のCSVファイルの他のすべての行を読み込み、なぜ私はわからないスキャナでCSVファイルを1行おきに読み取るのはなぜですか? Java

public DataProcess(String filename, String[][] contents, int n) {//n is 6 for contents, 5 for fiveMinContents 
     Scanner fileReader = null; 
     try { 
      fileReader = new Scanner(new File(filename)); 
     } catch (FileNotFoundException ex) { 
      System.out.println(ex + " FILE NOT FOUND "); 
     } 
     fileReader.useDelimiter(","); 
     int rowIndex = 0; 
     while (fileReader.hasNext()) { 
      for (int j = 0; j < n; j++) { 
       contents[rowIndex][j] = fileReader.next(); 
       System.out.println("At (" + rowIndex +", "+j+"): " + 
       contents[rowIndex][j]); 
      } 
      rowIndex++; 
      fileReader.nextLine(); 
     } 
    } 

:コードは次のようになります。最初のものはうまくいきますが、今は他のすべての行をスキップします。なぜそれは1つではなく他のものでは機能しませんか?私はEclipseの最新のアップデートでこれを実行しています。

私もthis答えをチェックして助けになりませんでした。

+0

@ReutSharabaniいいえ、2つのファイルはほぼ同じ構造をしています。異なる唯一の点は、2番目のファイルに軍用時間の番号を持つ追加行があることです。 22:05 –

答えて

2

ループの最後の行が1行を読み、それを破棄するためです。あなたはアプローチがあなたのために働くかもしれないが、あなたはまた、

System.out.println(Arrays.deepToString(contents)); 
+0

ファイルの例は、「1/2/2005」、「19:05」、「116.47」、「116.47」、「116.12」、「116.17」です。 'contents [rowIndex] = fileReader.split(" \\ s + ");'というコードを使用すると、区切られた値は多次元配列の場所に置かれますか?私はMD配列に値を割り当てる印象を受けました。一つは 'contents [someRow] [someColumn] = someValue'を使う必要がありました。別のやり方を提案したのですか? –

+0

@NickPredeyはい、 'String.split'は配列を返します。多次元配列は配列の配列です。したがって、 'contents [someRow]'は***配列として割り当てられます。 –

2

のように1回のコールで多次元配列を印刷することができ

while (fileReader.hasNextLine()) { 
    String line = fileReader.nextLine(); 
    contents[rowIndex] = fileReader.split(",\\s*"); 
    System.out.println("At (" + rowIndex + "): " 
      + Arrays.toString(contents[rowIndex])); 
    rowIndex++; 
} 

、のようなものを必要とし、それは最適ではないのです。 Javaのための事前作成されたCSVリーダーがあります。一つの例はcommons-csvです:

Reader in = new FileReader("path/to/file.csv"); 
Iterable<CSVRecord> records = CSVFormat.EXCEL.parse(in); 
for (CSVRecord record : records) { 
    String date = record.get(1); 
    String time = record.get(2); 
    // and so on, so forth 
} 

クラスパス上にある必要はありsmall number of dependenciesがあります。希望が役立ちます。

-1

この問題の原因がわかりました。

まず、推奨されている外部ライブラリを使用することをお勧めします。

問題は、この2番目のファイルが行全体を読み取っていたためですが、最初のCSVファイルは私が望むものを読み込んでいましたが、無視していたファイルの最後に列がありました。行の末尾に異なる区切り文字やその行に沿ったものがある場合は、CSVファイルを構造化する方法が必要です。この問題を解決するために、2番目のファイルに余分な列を追加しましたが、私はそれを読んでいません。それだけである。

要するに、外部のCSVリーダーライブラリを使用してください。それをやりたくない場合は、ファイルの最後の列の直後に列を追加し、それを読み取らないでください。

関連する問題