2011-06-29 10 views
6

Próbuję zaimportować plik CSV do tablicy, której mogę użyć w programie Java. Plik CSV został pomyślnie zaimportowany, a dane wyjściowe pojawiają się na terminalu, ale powoduje to błąd:Parsowanie danych z CSV do tablicy w Javie

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

na końcu. Ponadto, gdy próbuję wywoływać elementy w tablicy, pokazuje również ten sam błąd. Moje kodu jest poniżej:

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

Dlaczego używasz stałej kodowanej w pętli for, zamiast rozmiaru wyniku? – Perception

+0

Możesz użyć istniejącego interfejsu API języka Java CSV do swoich potrzeb: na przykład http://sourceforge.net/projects/csv4j/ lub http://sourceforge.net/projects/javacsv/. –

+0

@Perception ma rację, czy na pewno masz 3 wartości po przeczytaniu linii? – Marcelo

Odpowiedz

6

Jesteś znacznie lepiej wyłączyć za pomocą odpowiedniego parsera CSV niż hacking wadliwego One Up siebie: http://opencsv.sourceforge.net/

CSV nie jest prosty format jeden można pozwolić, aby myśleć (tak, linia może zawierać ,, która nie rozdziela dwóch części danych).

+0

Jak nazwałbyś pakiet opencsv w programie Java? Próbowałem go wcześniej wdrożyć i wydaje się, że nie jest to jakoś poprawne. Edycja: Właśnie znalazłem katalog/examples. –

+0

Powinno być możliwe przeanalizowanie prostego pliku csv bez użycia biblioteki "csv4j" ... –

+0

Inne odczyty w Internecie wskazywały, że przeciąganie bibliotek CSV może być łatwiejsze. Ale tak, jeśli wiesz, jak łatwo przetworzyć prosty plik CSV w tablicy, do której dostęp ma reszta programu Java, byłbym bardzo wdzięczny! –

0

Wygląda na to, że wiersz w pliku zawsze ma trzy kolumny nie jest prawdziwe dla wszystkich linii. Wymienić dla instrukcji pętli z poniższej linii do wyeliminowania wyjątek i zobaczyć, dlaczego tak się stało:

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

Jest to odpowiedź na powyższe pytanie

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

Proponuję nie ty Ponowne wynalezienie koła, gdy istnieje tak wiele wspaniałych bibliotek. Spróbuj uniVocity-parsers z kodem następującym snippt jako odniesienie:

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

Jak widać, tylko 2 linie wymagane, aby zakończyć zadanie analizowania danych csv do tablicy. Ponadto biblioteka udostępnia pełną listę funkcji do analizowania danych CSV z doskonałą wydajnością.