2011-06-29 34 views
6

Estoy tratando de importar un archivo CSV en una matriz que puedo usar dentro de un programa Java. El archivo CSV se ha importado correctamente y el resultado aparece en el Terminal pero arroja el error:Análisis de datos de CSV a matriz en Java

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

al final. Además, cuando intento activar elementos en la matriz, también muestra el mismo error. Mi código es el siguiente:

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

¿Por qué está utilizando una constante codificada en su bucle for, en lugar del tamaño del resultado? – Perception

+0

Puede usar la API de CSV Java existente para sus necesidades: http://sourceforge.net/projects/csv4j/ o http://sourceforge.net/projects/javacsv/, por ejemplo. –

+0

@Perception tiene razón, ¿está seguro de tener 3 valores después de leer una línea? – Marcelo

Respuesta

6

Es mucho mejor usar un analizador CSV adecuada de la piratería de una defectuosa uno usted mismo: http://opencsv.sourceforge.net/

CSV no es el formato simple de uno podría estar vamos a pensar (sí, una línea puede contener un , que no separe dos datos).

+0

¿Cómo llamarías al paquete opencsv en un programa Java? Intenté implementarlo antes y parece que no lo estoy haciendo bien de alguna manera. Editar: Acabo de encontrar el directorio/examples. –

+0

Uno debería poder analizar un archivo csv simple sin usar alguna biblioteca "csv4j" ... –

+0

Otras lecturas en Internet indicaban que extraer bibliotecas CSV podría ser más fácil. Pero sí, si sabes cómo analizar fácilmente un archivo CSV simple en una matriz a la que se puede acceder mediante el resto del programa Java, ¡te lo agradecería enormemente! –

0

Parece que su suposición de que una línea en el archivo siempre tiene tres columnas no es verdadera para todas las líneas. Vuelva a colocar la instrucción for bucle con la siguiente línea para eliminar la excepción y ver, por lo que sucedió:

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

Esta es la respuesta para la pregunta anterior

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

no te sugiero reinventando la rueda cuando hay tantas bibliotecas geniales por ahí. Prueba el uniVocity-parsers con el siguiente código snippt como referencia:

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

Como se puede ver, sólo 2 líneas requeridas para terminar la tarea de analizar los datos CSV en la matriz. Además, la biblioteca proporciona una lista completa de características para analizar datos CSV con un excelente rendimiento.