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.
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.
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.
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.
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.
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
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.
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.