none
Java y CSV grandes - Problema de accesso a columna RRS feed

  • Pregunta

  • Hola, estoy en JAVA programando con archivos CSV (nuevo en esto de programar con archivos CSV). Tengo ahora uno que es enorme y Excel no lo abre completamente por superar el limite de celdas, en su lugar lo puedo revisar con bloc de notas. Resulta que el csv, contiene unas serie de columnas, las cuales son las siguientes que mostraré junto a unos cuantos registros.

    REGION; PROVINCIA; COMUNA; DC; AREA; ZC_LOC; ID_ZONA_LOC; NVIV; NHOGAR; TIPO_HOGAR; TIPO_OPERATIVO
    15; 152; 15202; 1; 2; 6; 13225; 1; 1; 1; 1
    15; 152; 15202; 1; 2; 6; 13225; 3; 1; 6; 1
    15; 152; 15202; 1; 2; 6; 13225; 9; 1; 4; 1
    15; 152; 15202; 1; 2; 6; 13225; 10; 1; 1; 1

    Eso es un pequeño extracto del csv que tengo. En realidad ese mismo dato "region" tiene como al menos 2000 registros.

    El tema es que intento acceder a la columna región la cual se comparará con un valor ingresado por el usuario. Luego se obtendrá la suma total de los campo NVIV (numero viviendas) de todos los registros de región, que coincidan con el valor entregado por el usuario, al ser una suma, entregará un único valor.

    Suponiendo que esto no es JAVA, y es SQL Server por ejemplo, la siguiente consulta describe claramente lo que intento hacer:

    SELECT region, sum(nviv) AS 'NumeroViviendas' FROM censo2010 WHERE region = 3

    Eso mismo intento realizar pero en JAVA, la condición WHERE vendría siendo el valor ingresado por el usuario. Ahora dejo el cogido que llevo y el problema que obtengo, el cual es lo que intenta describir el título:

    package hogares; import java.util.*; import com.opencsv.*; import java.io.*; import org.apache.commons.lang3.*; public class Hogares { public static final String SEPARADOR = ";"; public static void main(String[] args){ int opc; Scanner sc = new Scanner(System.in); System.out.println("MENU CENSO HOGARES"); System.out.println(""); System.out.println("1. Conteo de Regiones segun una region"); System.out.println("2. Promedio de hogares por manzana dada"); System.out.println("3. Numero de manzanas para una region dada"); System.out.println("4. Salir"); System.out.println(""); System.out.println("Seleccione una opcion: "); opc = sc.nextInt(); switch(opc){ case 1: ConteoHogares(); break; case 2: PromedioHogares(); break; case 3: NumeroManzanas(); break; case 4: System.out.println("SALIENDO"); System.out.println(""); break; default: System.out.println("Debe ingresar una opcion valida dentro del rango [1-4]"); } } private static void ConteoHogares(){ int valorRecibido; Scanner scanner = new Scanner(System.in); System.out.println("Digame un numero de region: "); valorRecibido = scanner.nextInt(); try { FileReader filereader = new FileReader("C:\\Users\\Admin\\Desktop\\Censo2010_Hogares.csv"); CSVReader csvReader = new CSVReader(filereader); System.out.println("REGION\tNVIV"); String[] nextLine = csvReader.readNext(); int hogares = 0; while ((nextLine = csvReader.readNext()) != null) { String region = nextLine[0]; String nviv = nextLine[7]; if (region != null && !region.isEmpty() && nviv != null && !region.isEmpty()) { int currentRegion = Integer.parseInt(region); if (currentRegion == valorRecibido) { int currentNviv = Integer.parseInt(nviv);

    /*

    AQUI PROCEDO A SUMAR EL CAMPO NVIV PARA OBTENER

    EL TOTAL DE VIVIENDAS PARA UNA REGION DADA

    */

    hogares = hogares + currentNviv; //System.out.println(region + "\t" + nviv); } }else { System.out.println("Hubo un error desconocido, no se puede proceder"); } } System.out.println(requestedRegion + "\t" + hogares); } catch (Exception e) { e.printStackTrace(); } } private static void PromedioHogares() { } private static void NumeroManzanas() { } }


    Siendo este el error que obtengo en la ejecución del código:



    Y no sé porque obtengo ese error, no creo que sea un error de código, sospecho que puede ser al acceder a la columna. Eso, si me pueden ayudar a saber porque obtengo ese error y como solucionarlo para que así me muestre el total de viviendas para la región dada, se los agradecería mucho. Quedo atento.





    • Editado M4uriXD martes, 9 de junio de 2020 0:11
    martes, 9 de junio de 2020 0:08

Respuestas

Todas las respuestas

  • Deleted
    • Marcado como respuesta M4uriXD martes, 9 de junio de 2020 16:22
    martes, 9 de junio de 2020 5:25
  • Más cosas además de lo anterior: cerciórate de que antes de acceder a las columnas de nextLine metes un "if" para comprobar cuántas columnas contiene nextLine. Puede que te llegue alguna línea con menos columnas debido a un error dentro del fichero, o debido a que haya un salto de línea al final y te tome una línea vacía.

    Ah, y por cierto, aunque no tiene nada que ver con el error que te sale, en esta línea:

    if (region != null && !region.isEmpty() && nviv != null && !region.isEmpty()) {

    seguramente el último region.IsEmpty tendría que ser nviv.IsEmpty.

    martes, 9 de junio de 2020 6:05
  • Muchas gracias ahora funciona, voy a leer tambien la documentacion, seguro de alli aprendo más. De verdad muchas gracias.
    • Editado M4uriXD martes, 9 de junio de 2020 16:22
    martes, 9 de junio de 2020 16:22
  • Hola,

     

    gracias por confirmar que encontraste una respuesta a tu pregunta.

     

    Saludos cordiales

     

    Gabriel Castro

    jueves, 16 de julio de 2020 1:54