Não; pense em um campo string que tenha vírgulas dentro. Por exemplo:
2.34,"R. dos Bobos, 0",2008-09-23
Você pode ver que há uma vírgula dentro de um campo, a qual não deve ser usada para separar os campos. Split não leva isso em conta, e expressões regulares têm certa dificuldade de tratar tais casos.
Se o campo string contiver aspas dentro, então elas devem ser duplicadas. O segundo campo contém a string Frederico “Fred” Abranches. Em um arquivo CSV ela apareceria como:
2.34,"Frederico ""Fred"" Abranches",2008-09-23
Outra coisa mais chata que aparece em arquivos CSV é que o Excel em português gera arquivos CSV separados por “;” e com os números de ponto flutuante usando vírgulas flutuantes. Algo como:
2,34;"América; Ásia; Oceania";2009-12-10
Embora haja soluções para tratamento de arquivos CSV, se você simplesmente não quiser usar nada fora da biblioteca-padrão do Java, pode tentar usar a java.io.StreamTokenizer.
ivela
Oi de novo!
Segue um exemplo com StringTokenizer:
publicstaticvoidmain(Stringargs[]){StringminhaString="Eita string dificil de separar!";StringTokenizertokenizer=newStringTokenizer(minhaString," ");// os espaços serão utilizados na quebrawhile(tokenizer.hasMoreTokens())System.out.println("String atual: "+tokenizer.nextToken());}
Espero ter ajudado…
T
thingol
StringTokenizer não cuida direito do caso em que há campos vazios, como em:
20,,3,56,"abcd",,dd
Nesse caso, StringTokenizer acaba “pulando” esse campo vazio. Se quiser usar alguma coisa que não pule campos vazios, e supor que em suas strings nunca vai aparecer uma vírgula (o que normalmente você não pode supor), use String.split com 2 parâmetros ( para o segundo, passe -1 ).
CintiaDR
Huuuuuuuuum, entendi.
Obrigada =)
hcbelias
gente, mas como dito anteriormnente…
pode ser que um dos campos contenha a virgula
mas tenho certeza de que o campo n tem "…
ai utilizando o stringtokenizer ou o split…
separando p virgula, eu perco este campo…
por isso que pensei em criar uma exp reg
T
thingol
Vou dar um exemplo com StreamTokenizer daqui a pouco. É meio chatinho, mas pelo menos evita tais problemas de ter uma vírgula dentro.
hcbelias
consegui monta
a regex
ao invez de tenta escolhe a virgula
eu peguei “,” p dividir a string
String[] campos = linha.split("["][,]["]");
deu certinho…
o campos[0] vai ter um " na frente
e o
campos[ultimo] vai ter um " no final
ai e so tratar isso…
T
thingol
Eu falei tão bem do StreamTokenizer, mas ele tem alguns problemas com strings que contém aspas dentro (não tem com vírgulas dentro). Rode o programa abaixo, e veja o que estou falando.
importjava.io.*;importjava.util.*;classCliente{privatedoublevalor1,valor2;privateStringendereco,nome;publicCliente(){}publicCliente(finaldoublevalor1_,finaldoublevalor2_,finalStringendereco_,finalStringnome_){valor1=valor1_;valor2=valor2_;endereco=endereco_;nome=nome_;}publicvoidsetValor1(finaldoublevalor1_){valor1=valor1_;}publicvoidsetValor2(finaldoublevalor2_){valor2=valor2_;}publicvoidsetEndereco(finalStringendereco_){endereco=endereco_;}publicvoidsetNome(finalStringnome_){nome=nome_;}publicStringtoString(){returnString.format("[%.2f;%.2f;%s;%s]",valor1,valor2,endereco,nome);}}classTesteCSV{privatestaticStringquote(finalStringstr){StringBuildersb=newStringBuilder();sb.append("\"");for(inti=0;i<str.length();++i){finalcharch=str.charAt(i);if(ch=='\"'){sb.append("\"");}sb.append(ch);}sb.append("\"");returnsb.toString();}publicvoidgerarArquivo(){PrintWriterpw=null;try{pw=newPrintWriter(newBufferedWriter(newFileWriter("teste.csv")));// Note que printf ("%.2f") imprime com vírgulas, não com pontos, o que é indesejável neste caso.// Portanto, iremos pôr um parâmetro adicional (Locale.US) para que ele imprima com pontospw.printf("valor1,valor2,rua,nome%n");pw.printf(Locale.US,"%.2f,%.2f,%s,%s%n",2.34,1002.45,quote("R. dos Bobos, 0"),quote("Frederico \"Fred\" Abranches"));pw.printf(Locale.US,"%.2f,%.2f,%s,%s%n",105.35,-2334.47,quote("R. da Amargura, 13"),quote("James Ryan Gosling O'Malley"));}catch(IOExceptionex){ex.printStackTrace();}finally{pw.close();}}publicvoidlerArquivo(){BufferedReaderbr=null;try{br=newBufferedReader(newFileReader("teste.csv"));List<Cliente>clientes=newArrayList<Cliente>();// A primeira linha contém apenas nomesbr.readLine();for(Stringstr=br.readLine();str!=null;str=br.readLine()){StringReadersr=newStringReader(str);StreamTokenizerst=newStreamTokenizer(sr);st.parseNumbers();// necessárioClientecli=newCliente();inttokenType;tokenType=st.nextToken();if(tokenType==StreamTokenizer.TT_NUMBER)cli.setValor1(st.nval);tokenType=st.nextToken();// deve ser uma vírgulatokenType=st.nextToken();if(tokenType==StreamTokenizer.TT_NUMBER)cli.setValor2(st.nval);tokenType=st.nextToken();// deve ser uma vírgulatokenType=st.nextToken();if(tokenType=='\"'||tokenType==StreamTokenizer.TT_WORD)cli.setEndereco(st.sval);tokenType=st.nextToken();// deve ser uma vírgulatokenType=st.nextToken();if(tokenType=='\"'||tokenType==StreamTokenizer.TT_WORD)cli.setNome(st.sval);clientes.add(cli);}System.out.println(clientes);}catch(IOExceptionex){ex.printStackTrace();}finally{if(br!=null)try{br.close();}catch(IOExceptionex){}}}publicstaticvoidmain(String[]args){TesteCSVtc=newTesteCSV();tc.gerarArquivo();tc.lerArquivo();}}