Pessoal, eu tenho a seguinte String
String texto ="2|wilson moraes|(062)3434-8485|rua 1040 st. pedro ludovico"
e gostaria de quebrar essa string cada vez que houver um [color=darkred]|[/color]
pra isso, eu to usando o método split, e uso da seguinte maneira:
String[] teste = texto.split("|");
só que, na verdade ele quebra pra mim em letras, vem algo do tipo
2
w
i
l
s
o
n
eu tentei usar o StringTokenizer , só que se por exemplo dentro da minha string existisse um João
Ele me traz: Jo�o
Alguém, sabe me dizer oque estou fazendo de errado ?
Eu gosto mais do tokenizers e para teus caracteres não mudarem, você tem usar o charset correto do arquivo de origem no método readLine() ,
no código abaixo eu to usando “ISO-8859-1” mas tem vários outros:
US-ASCII Seven-bit ASCII, a.k.a. ISO646-US, a.k.a. the Basic Latin block of the Unicode character set
ISO-8859-1 ISO Latin Alphabet No. 1, a.k.a. ISO-LATIN-1
UTF-8 Eight-bit UCS Transformation Format
UTF-16BE Sixteen-bit UCS Transformation Format, big-endian byte order
UTF-16LE Sixteen-bit UCS Transformation Format, little-endian byte order
UTF-16 Sixteen-bit UCS Transformation Format, byte order identified by an optional byte-order mark
String delimitadores = "|";
java.io.BufferedReader br = new java.io.BufferedReader(new java.io.FileReader(f.getPath(), ));
while ((sLinha = br.readLine("ISO-8859-1")) != null) {
java.util.StringTokenizer st = new java.util.StringTokenizer(sLinha, delimitadores, true);
while (st.hasMoreTokens()) {
arq.addListaPalavras(st.nextToken());
}
Quanto ao Split, não sei bem, mas ele tem sempre algumas coisas a ver com o tipo de caracter que se usa.
Algumas vezes é necessário usar \ no literal. Por isso não gosto muito dele.
João, não consegui alterar o charset, conforme vc mostrou na linha
while ((sLinha = br.readLine("ISO-8859-1")) != null) {
Olá!
O método split tem uma particularidade que muitos não sabem: O método split() trabalha com expressões regulares.
Veja em http://download.oracle.com/javase/1.4.2/docs/api/java/util/regex/Pattern.html para maiores informações.
Quanto ao teu erro, tenta fazer assim:
String[] txts = texto.split("[|]");
Fiz um teste com split, realmente tem que usar:
String[] teste = texto.split("\\|");
para funcionar do jeito que você quer.
Valeu João, fazendo assim
String[] testatk = line.split("\\|");
realmente corrigiu meu erro…
Agora gostaria muito de usar o StringToken, mais aquele problema com caractere me impede… =\
O charset é definido na hora de salvar o arquivo. Tipo:
String pathArquivo = "fileenconding.txt";
BufferedWriter bufferedWriter = new BufferedWriter(
new OutputStreamWriter(new FileOutputStream(pathArquivo),
Charset.forName("US-ASCII")));
bufferedWriter.write("çãéü");
bufferedWriter.close();
BufferedReader reader = new BufferedReader(new InputStreamReader(
new FileInputStream(pathArquivo), Charset.forName("US-ASCII")));
System.out.println(reader.readLine());
reader.close();
Se tu rodar esse código, a saída vai ser:
???
Agora se tu usar o charset ISO-8859-1, a saída é exibida corretamente:
String pathArquivo = "fileenconding.txt";
BufferedWriter bufferedWriter = new BufferedWriter(
new OutputStreamWriter(new FileOutputStream(pathArquivo),
Charset.forName("ISO-8859-1")));
bufferedWriter.write("çãéü");
bufferedWriter.close();
BufferedReader reader = new BufferedReader(new InputStreamReader(
new FileInputStream(pathArquivo), Charset.forName("ISO-8859-1")));
System.out.println(reader.readLine());
reader.close();
Tudo vai depender do charset do arquivo. Se ele for ASCII nem adianta ler como ISO-8859-1 que o texto do arquivo não vai ser lido direito.
[quote=wilsontads]João, não consegui alterar o charset, conforme vc mostrou na linha
while ((sLinha = br.readLine("ISO-8859-1")) != null) {
Nao entendi!!!
Como assim, não conseguiu alterar o charset???
É só trocar um String que representa um charSet por outra e ir testando pra ver qual funciona.
Dias atrás tive um problema, colocava o charSet no readLine e não funcionava.
Daí tentei colocar ele no InputStreamReader (ou algo assim) e funcionou perfeitamente.
Interessante, vivendo e aprendendo.
Já usei várias vezes os charSets mas nunca usei esse método forName:
Charset.forName(“ISO-8859-1”)
sempre usava diretamente, só colocando entre aspas no segundo argumento do readLine ou do InputStreamReader.
matheuslmota meu BufferedReader ficou da seguinte forma:
BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(file), Charset.forName("ISO-8859-1")));
Quando executei, exibiu o caractere normalmente… ou seja, funcionou…
e a solução pro split, ficou do jeito que o João disse…
de qualquer forma, obg à todos.
Só ressuscitando o tópico, eu voltei a ter problemas…
como dito anteriormente,eu passei a usar o StringTokenizer,
só que ela tava me dando muita dor de cabeça, dando altos paus,
ai fui ver no site da sun, e a mesma aconselha usar o split da string, ao invés do StringTokenizer.
porém, antes eu fazia algo do tipo .split("\|");
e dava certo…
o problema é que, eu pretendo armazenar o split em uma variável, por exemplo:
[code]String texto="“001|cliente1|cidade1|estado1"”;
String spliter= “|”;
String[] teste = texto.split("\"+spliter);
//ou
String[] teste = texto.split("["+spliter+"]");
/*java.util.regex.PatternSyntaxException: Unclosed character class near index 1 []
quando uso []
e
java.util.regex.PatternSyntaxException: Unexpected internal error near index 1^
quando uso o \
*/[/code]
Na verdade, a String texto, que to tendo problemas é a seguinte:
"ome 5|5555-5555|rua 5"
Isso é relativamente fácil. Use Pattern.quote:
String padrao = "|";
String texto = "ome 5|5555-5555|rua 5" ;
String[] campos = texto.split (Pattern.quote (padrao));
http://download.oracle.com/javase/6/docs/api/java/util/regex/Pattern.html#quote(java.lang.String)
Teoricamente talvez funcione…
na prática ele retorna um vetor de tamanho 1, contendo a string texto
O programa abaixo:
import java.util.regex.*;
class TesteSplit {
public static void main(String[] args) {
String padrao = "|";
String texto = "abacaxi|abacate|abobrinha";
String[] campos;
campos = texto.split (Pattern.quote (padrao));
for (String s : campos) {
System.out.println (s);
}
}
}
Imprime corretamente:
abacaxi
abacate
abobrinha
Realmente, eu estava fazendo o seguinte:
campos = texto.split (Pattern.quote ("\\"+padrao));