El análisis de archivos CSV de Java no analiza columnas vacías al final

Estoy analizando un archivo CSV, sin embargo, hay una fila donde las últimas 9 columnas están vacías y la cadena dividida por comas ignora las columnas vacías restantes.

Aquí hay un código para demostrar esto:

String s="L2,,,,,,,,,,,,,,,,,,108.50,-188.04,,,,,,,,,";
String[] columns = s.split(",");
System.out.println(columns.length);

El tamaño de las columnas es 20, cuando debería ser 29. ¿Alguna idea?

Respuesta 1

Mire la documentación para String.split:

Este método funciona como si invocara el método de división de dos argumentos con la expresión dada y un argumento límite de cero. Por lo tanto, las cadenas vacías finales no se incluyen en la matriz resultante.

Por lo tanto, debe mirar las opciones para el otro splitmétodo

El parámetro límite controla la cantidad de veces que se aplica el patrón y, por lo tanto, afecta la longitud de la matriz resultante. Si el límite n es mayor que cero, el patrón se aplicará como máximo n - 1 veces, la longitud de la matriz no será mayor que n, y la última entrada de la matriz contendrá todas las entradas más allá del último delimitador coincidente. Si n no es positivo, el patrón se aplicará tantas veces como sea posible y la matriz puede tener cualquier longitud. Si n es cero, el patrón se aplicará tantas veces como sea posible, la matriz puede tener cualquier longitud y las cadenas vacías finales se descartarán.

El énfasis es mío.

Necesitas:

String[] columns = s.split(",", -1);
Respuesta: 2

Los documentos de split dicen:

Si n es cero, el patrón se aplicará tantas veces como sea posible, la matriz puede tener cualquier longitud y las cadenas vacías finales se descartarán .

split(String regex)llama al splitmétodo sobrecargado con un límite de 0. Por eso tiene una longitud de matriz de 20, todas las cadenas vacías después de -188.04 se descartan en la matriz resultante.

Si desea obtener todas las cadenas finales vacías, puede dar un límite negativo para decir que desea aplicar el patrón tantas veces como sea posible.

String[] columns = s.split(",", -1); //length is 29 there

Aunque no es difícil analizar CSV, también puede considerar usar un analizador CSV.

Respuesta: 3

Estoy trabajando con una interfaz que toma el tipo Object como su entrada. Esto es lamentable para mí, ya que tengo datos primitivos que a veces necesito pasar a través de la interfaz. Esto, por supuesto, obliga ...

Recibo un error de Xamarin al compilar un nuevo proyecto de Android. java \ lang \ Object.class versión principal 51 más reciente que 50, la versión principal más alta admitida por este compilador. Alguien sabe el motivo de ...

Estoy haciendo la transferencia de Android, quiero modificar el marco de Android para hacer un bucle de animación de arranque infinitamente, así que modifiqué el 「desc.txt」 en bootanimation.zip de la siguiente manera: 480 360 1 p 0 0 part0 I ...

Solo hago un proyecto simple donde trato de mostrar / ocultar un diseño en la parte superior de un LinearLayout con TranslateAnimation. Hubo un parpadeo porque cuando llamé aAnimationEnd (), la animación no fue ...