Como eu faço para ler e pegar somente esses valores depois do -> , para que eu posso soma-los para obter um resultado final?
Fiz da seguinte forma , mas não consegui.
Já pesquisei em diversos foruns mas não sanei minha duvida
Meu codigo em java .
BufferedReader leitor = new BufferedReader (new FileReader(“CARTEIRA\Chart of accounts\PlanConCxToReceive.txt”));
String texto = leitor.readLine();
String[] palavras = texto.split(" -> ;");
while (texto !=null) {
texto = leitor.readLine();
System.out.println(palavras);
}
Meu arquivo txt está com a seguinte estrutura .
Bills to receive
refael -> 50.0;
Bills to receive
rafael -> 5.0;
Quando você usa split
, tem que indicar a string que será usada para dividir.
Como você usou " -> ;"
, ele tentará buscar exatamente este trecho (espaço, hífen, >
, espaços e ponto-e-vírgula). Mas esta sequência não existe no seu arquivo, pois depois de ->
tem um número, então o split
não vai fazer a quebra da maneira que você precisa.
Uma maneira de resolver é fazer a quebra somente por ->
, depois no número você elimina o ;
manualmente. E por fim, você converte a string para número e soma ao total:
double total = 0;
try (BufferedReader leitor = new BufferedReader(new FileReader("CARTEIRA\\Chart of accounts\\PlanConCxToReceive.txt"))) {
String texto;
while ((texto = leitor.readLine()) != null) {
String valor = texto.split(" -> ")[1];
total += Double.parseDouble(valor.substring(0, valor.length() - 1));
}
}
System.out.println(total);
No caso, valor.substring(0, valor.length() - 1)
elimina o último caractere (que é o ;
), e Double.parseDouble
converte a string para número. Escolhi esta classe porque no arquivo os números possuem uma casa decimal, e parseDouble
consegue lidar com isso (Integer.parseInt
daria erro, por exemplo).
Também coloquei o BufferedReader
em um bloco try-with-resources (disponível a partir do Java 7), que garante que o arquivo será fechado ao final.
E o programa não faz validações: ele assume que sempre terá o ->
e a segunda posição sempre tem um número. Mas se quiser validar, pode fazer algo assim:
double total = 0;
try (BufferedReader leitor = new BufferedReader(new FileReader("CARTEIRA\\Chart of accounts\\PlanConCxToReceive.txt"))) {
String texto;
while ((texto = leitor.readLine()) != null) {
String[] partes = texto.split(" -> ");
if (partes.length > 1) {
String valor = partes[1];
try {
total += Double.parseDouble(valor.substring(0, valor.length() - 1));
} catch (NumberFormatException e) {
// não é número - mostrar alguma mensagem de erro, ignorar, etc
}
} else {
// linha não tem "->" - mostrar alguma mensagem de erro, ignorar, etc
}
}
}
Mano valeu mesmo pela atenção, mas ta dando erro de ArrayIndexOutOfBoundsException
nessa linha String valor = texto.split(" -> ")[1];
É o que eu falei: “E o programa não faz validações: ele assume que sempre terá o -> e a segunda posição sempre tem um número. Mas se quiser validar, pode fazer algo assim:”
E aí tem outro trecho de código que faz essa validação e evita esse erro…