Dividindo String com split

Olá pessoal!
Estou com uma duvida aqui e até agora não consegui achar um solução pra ela.
É o seguinte tenho uma String assim:

String registro = ("1, \"Joao da Silva\", \"Rua Dois\",12, \"Villa\" ");

e quando faço:

 arrayCampos = registro.split(","); 

ele divide os campos certinho, até aqui tudo bem.
O problema é que se em algum campo da String “registro” tivesse um nome com uma virgula no meio exemplo:

String registro = ("1, \"Joao, da Silva\", \"Rua Dois\",12, \"Villa\" ");

o split dividiria o nome em duas partes, entenderam?

Gostaria de saber se tem alguma maneira de dividir os campos dessa String por vírgula “,” , mais que ignorasse
tudo que estivesse entre aspas duplas.

Se alguém puder ajudar agradeço a atenção, valeu!

Neste caso, você precisa usar um StreamTokenizer (cuidado, é StreamTokenizer, não StringTokenizer). Isso é por causa do tratamento das aspas e do que está dentro das aspas.

Use o commons lang3 do apache. O StringUtils deles tem n funções. Você resolve isso rapidinho e null safe.

Rapidinho, null-safe, mas não resolve o problema dele :frowning: - eu li as descrições dos métodos e nenhum deles resolve esse problema em particular :slight_smile:

Ou utilize seu próprio algoritmo, ou pode fazer o split normalmente para virgula e então com uma segunda passada por cada campo se o atual possui aspas duplas concatena com o próximo até que o ultimo campo concatenado também contenha aspas duplas.

Trocando em miúdos junte os campos com aspas duplas, ora.

Esse é o problema típico de quem vai ler um arquivo CSV, quando o CSV tem strings cercadas com aspas. Usar um StreamTokenizer, nesse caso, é bem simples.

Você ainda pode fazer o split para aspas duplas e então fazer um segundo split para todos os campos que começa ou terminam com virgulas

Editado:“Só serve se as strings entre aspas duplas não contem vírgulas no começo e fim”

Se tiver um padrão, use uma expressão regular (http://pt.wikipedia.org/wiki/Express%C3%A3o_regular) para quebrar por números ou aspas seguidos de vígurla.

algo nesse sentido:"\"," || "[0-9],"

que fique bem claro que esse código não está correto, vai ter que estudar expressão regular ou bolar um algoritmo. Tente achar padrões nas Strings que você tem.

[quote=lucasportela]Se tiver um padrão, use uma expressão regular (http://pt.wikipedia.org/wiki/Express%C3%A3o_regular) para quebrar por números ou aspas seguidos de vígurla.

algo nesse sentido:"\"," || "[0-9],"

que fique bem claro que esse código não está correto, vai ter que estudar expressão regular ou bolar um algoritmo. Tente achar padrões nas Strings que você tem.[/quote]
Não vejo como fazer com regex.

Não tem como saber se a vírgula está dentro do nome, ou se está entre 2 dados, pois nas duas situações ela estaria entre 2 aspas duplas.

Se tem eu não sei como

[quote=Rodrigo Sasaki][quote=lucasportela]Se tiver um padrão, use uma expressão regular (http://pt.wikipedia.org/wiki/Express%C3%A3o_regular) para quebrar por números ou aspas seguidos de vígurla.

algo nesse sentido:"\"," || "[0-9],"

que fique bem claro que esse código não está correto, vai ter que estudar expressão regular ou bolar um algoritmo. Tente achar padrões nas Strings que você tem.[/quote]
Não vejo como fazer com regex.

Não tem como saber se a vírgula está dentro do nome, ou se está entre 2 dados, pois nas duas situações ela estaria entre 2 aspas duplas.

Se tem eu não sei como[/quote]

O padrão que eu achei ali foi uma (aspa ou número) seguido de vírgula, daria certo… caso todas as strings sigam este padrão

Opa, edit sacana hehehe, agora sim entendi o que você quis dizer :slight_smile:

Opa, edit sacana hehehe, agora sim entendi o que você quis dizer :)[/quote]

Eu li e vi que causou ambiguidade e percebi que só tem programador ao pé da letra aqui e botei na sintaxe de programador

Porque colocariam virgula num nome proprio ?

Opa, edit sacana hehehe, agora sim entendi o que você quis dizer :)[/quote]

Eu li e vi que causou ambiguidade e percebi que só tem programador ao pé da letra aqui e botei na sintaxe de programador[/quote]

Hehehehehe, pra ser mais chato ainda, o problema não é o programador :slight_smile: é o programa ^^
Mas pra ser justo seu código já dizia o que você queria dizer.

Ficou legal, só tem que tomar cuidado pois ao fazer o split assim, ele vai levar o número junto.

Ali foi um exemplo, mas é comum ter em endereços

“Rua 25, Conjunto K, casa 09”

Entendi ‘-’

Ou até citações bibliográficas. que fica algo assim: SASAKI, R. P.

String registro = ("1, \"Joao, da Silva\", \"Rua Dois\",12, \"Villa\" ");

Seria mais pratico voce dividir essa String em variaveis diferentes, nome para nome, endereco para endereco e etc… Nao sei como é esse seu sistema, mas provavelmente voce tera problemas de manutencoes, como agora.

http://docs.oracle.com/javase/6/docs/api/java/io/StreamTokenizer.html

Essa é uma das classes mais antigas do JDK. Acho que o próprio Gosling, ou alguém que escreveu o javac, criou essa classe para dar ao programador um subconjunto bem restrito das rotinas básicas que alguém usaria para criar um compilador ou interpretador.

o amigo entanglement, poderia me citar um exemplo? Eu dei uma lida na API e não entendi muito bem…