queria dividir um texto por linhas e quarda-las em array, não posso usar o StringTokenizer, falaram-me desse método split , porém não sei implementa-lo, quem souber e puder me ajudar, agradeço desde jah!!!
O método split quebra uma String em várias substrings a partir de um caracter definido por você. Por exemplo, a String nome;teste;10, se você escolher como caracter o “;” ele quebrará a string em nome teste 10, ou seja, um vetor de três posições.
Para usar o método split faça o seguinte:
String frase = "nome;teste;10";
String array[] = new String[3];
array = frase.split(";");
Espero ter ajudado
e quando a frase só tem um dado, por ex:
Nome;cpf;telefone;idade
teste;;;;
como faço pra ter esses dados. pq se “;;” = a nada, entao, Nome=teste;cpf= ; telefone= ; idade= ;
O split funciona da seguinte maneira. Você passa para ele um texto e um separador, e ele retorna para você um array, com o texto desse separador dividido em cada posição.
Por exemplo:
[code]string texto = “banana,maçã,laranja”;
string frutas[] = texto.split(",");
System.out.println(frutas[0]); //imprime banana
System.out.println(frutas[1]); //imprime maçã
System.out.println(frutas[2]); //imprime laranja[/code]
Se você tem o seu texto na memória, basta fazer:
string linhas[] = texto.split("\n");
E ele vai dividir o texto em todo lugar que houver uma quebra de linha “\n”, separando cada linha num array.
Caso você não tenha o texto na memória, e vá lê-lo de um arquivo, use a classe Scanner no lugar do split:
[code]Scanner leitor = new Scanner(new File(“seuArquivo.txt”));
List linhas = new ArrayList<>();
while (leitor.hasNextLine()) {
linhas.add(leitor.nextLine());
}
leitor.close();
String[] vetorDeLinhas = linhas.toArray();
[/code]
PS: A rigor o split trabalhar com expressões regulares. Assim, os separadores podem ser super sofisticados.
Engraçado este comportamento do split… Eu poderia jurar que ele retornaria uma String vazia, mas ele ignora o valor…
Este é um problema fácil de resolver… Se você tiver um objeto e for preencher os dados com os valores desta String, basta garantir que os dados não inicializem com null, e sim com uma String vazia. Assim se você pode ignorar os dados que não forem retornados pelo split. O mesmo acontece com um StringTokenizer…
Masssss como sempre nosso amigo google tem a solução!
Basta chamar split(";", -1). Para mais detalhes dê uma olhada:
http://java.sun.com/j2se/1.5.0/docs/api/java/lang/String.html#split(java.lang.String,%20int)
EDIT: Como alguém respondeu enquanto eu digitava, para o texto não ficar muito solto esta mensagem foi para a dúvida de liz.
Oi Bruno, valeu pela dica. Funcionou direitinho! Abs
Muito esclarecedor o exemplo do ViniGodoy.
Eu usei o split dentro de um método, para resolver um exercício da seguinte forma:
public void inverteString(String s){
String [] st1 = s.split(" ");
[b]for[/b]([b]int[/b] i = st1.length-1; i>=0; i--)
System.out.print(st1[i] + " ");
}
Neste caso, imprimo uma frase invertendo as posições das palavras.
e ai galera e quando a dividir um String sem nenhum separador
tipo preciso dividir os caractres um a um da pra fazer usando o split???
[quote=machitte]e ai galera e quando a dividir um String sem nenhum separador
tipo preciso dividir os caractres um a um da pra fazer usando o split???[/quote]
Para isso existe o método chatAt(). Retorna o caracter da posição indicada.
Outra opção é usar o método getBytes(), que retorna um array de caracteres.
[code]String texto = “Mico Maneco é levado”;
for (int i = 0; i < texto.length; i++) {
System.out.println(texto.charAt(i));
}[/code]
Pessoal, acredito que a minha duvida esteja envolvida com as questões comentadas acima.
O código abaixo foi feito para criar um arquivo texto e armazenar informações separadas o ponto e virgula.
Ex:
1;Letticia;RuaX;02216115980;08\11\1990;4545;1234;0.0;29\9\2014
2;Laura;RuaY;05215411223;21\10\1993;2121;1234;0.0;29\9\2014
Meu problema está em criar um código para seguinte solução:
A sexta e sétima posição equivalem a login e senha, quando a pessoa digitar essas informações tenho que percorrer o arquivo texto e verificar existe essas informações para que seja feito o logon.
public class Arquivo {
static void Armazena(ArrayList<Conta> cl) {
try {
File texto = new File("C:/texto.txt");
FileWriter escrita = new FileWriter(texto);
BufferedWriter escritor = new BufferedWriter(escrita);
for (int i = 0; i < cl.size(); i++) {
escritor.write(cl.get(i).toString());
escritor.newLine();
}
escritor.flush();
escritor.close();
escrita.close();
} catch (Exception e) {
System.out.println("Erro ao criar arquivo!!");
}
}
}
Galera o Linz perguntou e ninguém respondeu e eu tenho o mesmo problema aqui em uma aplicação, o negocio é o seguinte
eu tenho um arquivo csv tem o delimitador por ; sendo que o final de cada linha termina sem o delimitador até ai tudo bem facil de resolver e já foi resolvido
porém tenho outro problema que é o fato de as vezes o arquivo não conter informação entre os ;; ou seja as vezes fica ;;“valor”;;"outroValor;; e ai que acontece o problema
o meu scanner perde a posição por que ele ignora a primeira posição já indo direto para “valor” e ignora a terceira posição indo direto para "outroValor já pesquisei na internet
mas não encontrei a solução para esse problema que deve ser apenas um mero detalhe se alguém com mais experiencia por favor poder ajudar ficaria muito grato só falta isso para
eu terminar o meu pequeno projeto.
vou postar as partes do codigo que interessa
estou usando o seguinte delimitador
scanner.useDelimiter("([\n;]|(\r\n))+");
sendo que este esta correto pulando a linha quando encontra o final dela e separando por ;
o problema é que debugando coluna por coluna, ou seja posição por posição, percebo que ele perde a ordem quando encontra ;; gostaria de saber como resolver isso.
[color=red]spondendo ao samucation :[/color]
Tive o mesmo problema trabalhando na leitura de EFD(Speds) e tratei fazendo um replace na linha recebida trocando o delimitador(no meu caso o “|” e no teu caso “;”) por delimitador + " ". Com este espaço ele não entende que o caracter é duplicado e faz com que você capture as posições sempre iguais. Acredito que a lógica funcione para o Scanner.
Abaixo o exemplo melhor explicado.
public static void main(String[] args) {
/*Criamos a linha incluindo campos sem nenhum parametro
* Contamos que nesta string formaremos array de 6 posições, sendo o campo 4 igual " "(Entre os textos Programador e Java)
* Para que ele aceite no término daremos replace substituindo o delimitador por ele + " ", assim o método entenderá que há um campo onde estiver vazio
* No término passaremos o replaceFirst para retirar apenas o espaço que colocamos no replace anterior
*/
String sLinha = "Fabio;Thielen;Programador;;Java;Write once, run anywhere".replace(";", "; ");
String[] aCampos = sLinha.split(";");
for(int i = 0;i < aCampos.length;i++){
System.out.println("Campo "+i+": "+aCampos[i].replaceFirst(" ", ""));
}
}
}
Senhores, segue aqui a minha resolução, para a pergunta do caro amigo.
//Instanciando a Classe Scanner para variável sc
Scanner sc = new Scanner(System.in);
//Mensagem para o usuário entrar com o CEP
System.out.println(“Digite o CEP: “);
//Atribuição da variável, que vai receber a entrada do usuário
String cep = sc.next();
//Usando o método matches, para validar o CEP
//Formatação de 8 dígitos, para entrada de CEP
//A mesma deve ser colocada, de acordo com o tipo de dado
//Ex: RG = 9 CPF = 11
//Ex: CPF – cpf.mactches(”\d{11}”)
if (cep.matches("\d{8}")) {
//Atribuindo a variável a uma substring
//Que vai do índice 0(zero) ao índice 5(cinco)
String a = cep.substring(0, 5);
//Atribuindo a variável b uma substring
//Que vai do índice 5(cinco) ao índice 8(oito)
String b = cep.substring(5, 8);
//Criando uma variável(cep2) do tipo String
//Atribuindo variável cep2 a variável (a)
//Com o método concat, + a varável b
String cep2 = a.concat("-" + b);
//Saida na tela do resultado da variável cep2
System.out.println(cep2);
//System.out.println(a + “-” + b);
//Criando um algoritmo para validação do CEP
if (cep2.matches("\\d{5}-\\d{3}")) {
System.out.println("Válido");
} else {
System.out.println("Inválido");
}