2011-06-29 56 views
6

我正在嘗試將CS​​V文件導入可在Java程序中使用的數組中。 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不是簡單的格式中的一個可能讓想(是的,一行可以包含不分隔兩段數據的,)。

+0

你會如何將opencsv包調用到Java程序中?我曾試圖實施它,似乎沒有得到正確的方式。 編輯:剛剛找到/ examples目錄。 –

+0

一個應該能夠解析一個簡單的csv文件,而無需使用一些「csv4j」庫... –

+0

互聯網上的其他閱讀表明,拉取CSV庫可能更容易。但是,是的,如果您知道如何輕鬆將簡單的CSV文件解析爲可由Java程序的其餘部分訪問的數組,那麼我將不勝感激! –

0

看起來像你的假設,即一行總是有三列對所有行都不是真的。用下面的行替換爲循環語句,以消除異常並見,爲什麼它的發生:

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

的答案,我建議你不要當有這麼多優秀的圖書館時,重新發明輪子。嘗試uniVocity-parsers用下面的代碼snippt作爲參考:

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 
    // ...... 
} 

正如你可以看到,只有2完成分析CSV數據到陣列的任務所需要的線。此外,該庫還提供了以極佳性能分析CSV數據的完整功能列表。