es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

El método lee el flujo de entrada csv de manera diferente que el archivo csv.

Se me asignó la tarea de escribir un método que tome un archivo CSV y persista sus datos en el espacio apropiado en la base de datos. La función que escribí lo hace con éxito cuando los datos del CSV se ingresan directamente. Sin embargo, al usar cURL e ingresar un archivo CSV completo, no lee los delimitadores de nueva línea. En consecuencia, el CSV se convierte en una fila con x número de columnas, donde x es el número de celdas en el archivo. He intentado cambiar el formato del CSV (por ejemplo, usando retorno de carro vs avance de línea) pero nada parece funcionar. Adjunto el código que recorre el CSV, toma un InputStream csvData:

CSVReader reader = new CSVReader(new InputStreamReader(csvData));
String[] line;
int bookNum = 1, lineNum = 2; // omitir encabezados
while ((line = reader.readNext()) != null) {
    // mapear la fila
    String codigoProducto = line[0]; 
    String autor = line[1];
    String descripcion = line[2];
    Integer edicion;
    try {
        edicion = Integer.parseInt(line[3].replaceAll("[^\\d.]", ""));
    } catch (NumberFormatException nfe) {
        edicion = null;
    }
    String derechosAutor = line[4];
    String editorial = line[5];
    BigDecimal precioLista = !line[6].equals("") ? new BigDecimal(line[6]) : null;

    // hacer algo con los datos...

    if (bookNum == 1) System.out.println("Se ha procesado 1 libro");
    else System.out.println(bookNum + " libros han sido procesados");
    ++bookNum;
    ++lineNum;
}
Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Solución para leer datos CSV con cURL

    Parece que el problema está en la forma en que cURL envía los datos CSV al servidor. Cuando se utiliza cURL, los delimitadores de salto de línea no se interpretan correctamente, lo que hace que los datos CSV se traten como una sola fila.

    Una posible solución es modificar el código para dividir manualmente la cadena de entrada en filas separadas según el delimitador de salto de línea esperado. Por ejemplo, puedes reemplazar la línea de instanciación de CSVReader con:

    BufferedReader br = new BufferedReader(new InputStreamReader(csvData));
    String csvLine = "";
    while ((csvLine = br.readLine()) != null) {
        String[] line = csvLine.split(","); // reemplaza "," con tu delimitador de CSV
        // resto del código...
    }
    

    De esta manera, los datos de entrada se dividen en filas separadas según el delimitador de salto de línea esperado y luego cada fila se puede procesar utilizando el código existente.

    Otra posible solución es modificar el comando cURL para manejar correctamente los delimitadores de salto de línea. Esto puede implicar establecer el tipo de contenido correcto o usar banderas en el comando cURL.

    Independientemente de la solución elegida, es importante asegurarse de que los datos CSV estén correctamente formateados y puedan ser procesados correctamente por el servidor.

Comments are closed.