Referente ao arquivo Csv de análise de comandos de divisão Java

Eu tenho um arquivo csv no formato abaixo.

H,"TestItems_20100107.csv",07/01/2010,20:00:00,"TT1198","MOBb","AMD",NEW,, 

Eu preciso do comando split para ignorar as vírgulas dentro das aspas duplas. Então eu usei o comando split abaixo de um post anterior. Colou a URL que eu tomei este comando

 String items[] = line.split(",(?=([^\"]*\"[^\"]*\")*[^\"]*$)"); System.out.println("items.length"+items.length); 

Java: dividindo uma string separada por vírgula, mas ignorando aspas entre aspas

Quando eu corro para este CSV dados estou recebendo o items.length impresso como 8. As duas últimas vírgulas no final da linha após “NEW” são ignoradas. Eu quero que o comando split pegue essas vírgulas e me devolva o comprimento de 10. Não está pegando as vírgulas nulas se estiver no final, mas está pegando se estiver no meio da string. Não tenho certeza do que preciso modificar no comando split para resolver esse problema. Também no arquivo csv As aspas duplas dentro do conteúdo de um campo Texto podem ser repetidas (por exemplo, “Esta conta é uma” “grande” “uma”)

Não há nada de errado com a expressão regular. O problema é que o split descarta partidas vazias no final:

Este método funciona como se invocasse o método split de dois argumentos com a expressão dada e um argumento limite de zero. Cadeias vazias à direita não são, portanto, incluídas na matriz resultante.

Uma solução alternativa é fornecer um argumento maior que o número de colunas que você espera em seu arquivo CSV:

  String[] tokens = line.split(",(?=([^\"]*\"[^\"]*\")*[^\"]*$)", 99); 

Eu me deparei com esse mesmo problema hoje e encontrei uma solução simpe para arquivos csv: adicionando um campo extra contendo apenas um espaço no momento em que a divisão é executada:

 (line + ", ").split(","); 

Desta forma, não importa quantos campos vazios consecutivos possam existir no final do arquivo csv, split () retornará sempre n + 1 campos

Exemplo de session (usando bsh)

 bsh % line = "H,\"TestItems_20100107.csv\",07/01/2010,20:00:00,\"TT1198\",\"MOBb\",\"AMD\",NEW,, bsh % System.out.println(line); H,"TestItems_20100107.csv",07/01/2010,20:00:00,"TT1198","MOBb","AMD",NEW,, bsh % String[] items = line.split(",(?=([^\"]*\"[^\"]*\")*[^\"]*$)"); bsh % System.out.println(items.length); 8 bsh % items = (line + ", ").split(",(?=([^\"]*\"[^\"]*\")*[^\"]*$)"); bsh % System.out.println(items.length - 1 ); 10 bsh % 
    Intereting Posts