2013-10-25 141 views
0

對於Java作業分配,我需要創建一個讀取和寫入CSV文件的類。我目前在閱讀CSV時遇到了一些問題。下面的代碼僅輸出代碼的第一行,然後生成以下錯誤消息:'線程「main」中的異常java.lang.ArrayIndexOutOfBoundsException:1在com.gc01.FileManager.CSVManager.main(CSVManager.java: 27)「。在Java中讀取CSV文件時出現問題。只讀第一行

我已經看過各種示例,並且我知道'opencsv'包,但我需要自己編寫此代碼。我將問題定位到語句」System.out.print (數據[1])。」然而,當交叉引用這段代碼這一切似乎是罰款

我使用到從FileInput類的方法,由我的老師(http://www.devjavasoft.org/SecondEdition/SourceCode/Share/FileInput.java)指定

public class CSVManager { 
    public static void main(String [] args){ 

     Scanner sc = new Scanner (System.in); 
     System.out.println("Please enter the file directory of the chosen CSV"); 
     System.out.println("For Example: /Users/UserName/Downloads/FileName.csv"); 
     ///Users/ReeceAkhtar/Desktop/GeoIPCountryWhois.csv 
     final String fileName = sc.nextLine(); 
     System.out.println("How many columns?"); 
     final int columns = sc.nextInt(); 

     BufferedReader br = null; 
     String line = ""; 
     String splitBy = " , "; 

     try { 
      br = new BufferedReader(new FileReader(fileName)); 
      while((line = br.readLine()) != null) { 
       for (int i = 0; i < columns; i++) { 
        String[] data = line.split(splitBy); 
        System.out.print(data[i]); 
       } 
      } 
     } catch (FileNotFoundException e){ 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } finally { 
      if (br != null) { 
      try { 
        br.close(); 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } 
      } 
     } 
     System.out.println("File Read"); 
    } 
} 
+1

據推測,該行實際上不包含用戶指定的欄數。請注意,您應該在* for'循環之前執行拆分*,因此您只需執行一次,而不是每列執行一次(在同一行數據中)。 –

回答

1

異常是很清楚

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 1 

手段,您試圖訪問數組中的第1個要素不存在

既然你說System.out.print(data[i]);是在異常發生線路,然後爲第一行data必須填充只單個元件

調試噸他用IDE發現了爲什麼split方法會導致意想不到的元素。我懷疑,周圍的空間使用是造成" , "

+0

管理得到它的工作!謝謝你們! –

1

試試這個。如果你分開for循環,一切都會好起來的。

String[] data = line.split(splitBy); 
while((line = br.readLine()) != null){ 
    for (int i = 0; i < columns; i++){ 
     System.out.print(data[i]); 
    } 
} 
0
while((line = br.readLine()) != null){ 
    for (int i = 0; i < columns; i++){ 
    String[] data = line.split(splitBy); 
    System.out.print(data[i]); 
    } 
  1. 要拆分的for循環中一行多次,沒有任何理由。
  2. 您正在使用" , "進行分割(,這可能是您的原因ArrayIndexOfBound例外)而是使用",";如果您願意,可以使用上的trim()擺脫拖尾/領先的空白區域。
  3. 拆分後,爲確保一致性,請檢查data.length等於columns
  4. 我們現在在JDK 7的時代,我們可以使用try-with-resource其關閉內部try(){}背景下宣佈的資源,使我們擺脫finally

所以,你可能應該像下面這樣:

try (BufferedReader br = new BufferedReader(new FileReader(fileName))){ 
    while((line = br.readLine()) != null){ 
     String[] data = line.split(splitBy); 

     if(data.length != columns)continue; // check for consistency, 
             //might throw an exception 

     for (int i = 0; i < columns; i++){ 
      System.out.print(data[i].trim()); 
     } 

    }catch(IoExection ex) 
    { 
    ex.printStackTrace(); 
    }