2011-06-29 45 views
6

Tôi đang cố nhập tệp CSV vào một mảng mà tôi có thể sử dụng trong chương trình Java. Tệp CSV đã tự nhập thành công và đầu ra xuất hiện trên Thiết bị đầu cuối nhưng nó xuất hiện lỗi:Phân tích dữ liệu từ CSV sang mảng trong Java

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

ở cuối. Ngoài ra, khi tôi cố gắng gọi lên các phần tử trong mảng, nó cũng cho thấy cùng một lỗi. Mã của tôi là dưới đây:

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

Tại sao bạn sử dụng hằng số được mã hóa cứng trong vòng lặp for của bạn, thay vì kích thước kết quả? – Perception

+0

Bạn có thể sử dụng API Java CSV hiện tại cho nhu cầu của mình: http://sourceforge.net/projects/csv4j/ hoặc http://sourceforge.net/projects/javacsv/ chẳng hạn. –

+0

@Perception là đúng, bạn có chắc là bạn có 3 giá trị sau khi đọc một dòng không? – Marcelo

Trả lời

6

Bạn đang tốt hơn nhiều bằng cách sử dụng một cú pháp CSV thích hợp hơn hacking một lỗi lên bản thân: http://opencsv.sourceforge.net/

CSV không phải là định dạng đơn giản người ta có thể được phép để suy nghĩ (có, một dòng có thể chứa , không tách hai phần dữ liệu).

+0

Bạn sẽ gọi gói opencsv thành chương trình Java như thế nào? Tôi đã thử thực hiện nó trước và dường như không nhận được nó bằng cách nào đó. Chỉnh sửa: Chỉ tìm thấy thư mục/example. –

+0

Người ta có thể phân tích cú pháp tệp csv đơn giản mà không cần sử dụng một số thư viện "csv4j" ... –

+0

Các bài đọc khác trên Internet cho biết rằng việc kéo các thư viện CSV có thể dễ dàng hơn. Nhưng có, nếu bạn biết cách phân tích cú pháp một tệp CSV đơn giản thành một mảng có thể được truy cập bằng phần còn lại của chương trình Java, tôi sẽ đánh giá cao nó! –

0

Có vẻ như giả định của bạn, rằng một dòng trong tệp luôn là có ba cột không đúng cho tất cả các dòng. Thay thế cho tuyên bố vòng lặp với các dòng sau để loại bỏ các ngoại lệ và xem, tại sao nó happend:

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

Đây là câu trả lời cho câu hỏi trên

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

tôi đề nghị bạn không tái phát minh ra bánh xe khi có rất nhiều thư viện tuyệt vời ngoài kia. Thử uniVocity-parsers với mã snippt sau khi tham khảo:

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

Như bạn có thể thấy, chỉ có 2 dòng cần thiết để hoàn thành nhiệm vụ phân tích dữ liệu csv vào mảng. Ngoài ra, thư viện cung cấp danh sách đầy đủ các tính năng trong phân tích dữ liệu CSV với hiệu suất tuyệt vời.

Các vấn đề liên quan