Lendo arquivo txt - please

Boa tarde gente,

to penando aqui junto a um amigo para ler um arquivo TXT que contem 10 linhas com informações como:

5010015 453.65
" "
" "

Isso eh referente a um arquivo de consumo de um Id (5010015) com valor (453.65).

Como poderia ser feito essa leitura?

Sou novato em java.

pra começar não coloque “please” ou “ajude” ou qualquer coisa assim nos títulos dos tópicos, mantenha ele o mais objetivo possível.

Agora vamos ao problema.

A boa notícia é que parece ser uma leitura muito simples, o que você sabe de java? já manipulou arquivos? já manipulou Strings?

Você pode pesquisar o seguinte no google:
ler arquivos java

[=

O ID é sempre numérico, ou tem algum caracter não-numérico? Só para saber.

Esse é o caso clássico de uso do java.util.Scanner, que ouvi falar que é muito usada em tutoriais e cursos. (Eu, em particular, não gosto muito de usá-la, mas é questão de gosto pessoal.)

Veja em:

http://docs.oracle.com/javase/1.5.0/docs/api/java/util/Scanner.html

Não testei o código abaixo, mas tipicamente você teria algo como:

Scanner sc = new Scanner (new File ("arquivo.txt"));
while (sc.hasNext()) {
    String id = sc.next();
    double valor = sc.nextDouble();
    // Faça alguma coisa com "id" e "valor". 
}

WOW como foi rapido.

Entao, nunca li nao arquivos no java. Estou no meio da apostila fj11. No google ja procurei muuuito, porem, achei muita coisa ajudando quem realmente jah sabe.

bom o que puderem ajudar ja ajuda bastante. Vou ver o que o amigo acima orientou.

Valeu mesmo vcs todos, rapidez da poxa :slight_smile:

Abraços

Só por curiosidade pessoal mesmo, o que você preferiria usar? E talvez o motivo hehehe

Bom, pra começar normalmente o tipo de arquivos -texto que preciso ler é XML ou CSV, e para esses casos eu não preciso usar Scanner.

[quote=entanglement]O ID é sempre numérico, ou tem algum caracter não-numérico? Só para saber.

Esse é o caso clássico de uso do java.util.Scanner, que ouvi falar que é muito usada em tutoriais e cursos. (Eu, em particular, não gosto muito de usá-la, mas é questão de gosto pessoal.)

Veja em:

http://docs.oracle.com/javase/1.5.0/docs/api/java/util/Scanner.html

Não testei o código abaixo, mas tipicamente você teria algo como:

Scanner sc = new Scanner (new File ("arquivo.txt")); while (sc.hasNext()) { String id = sc.next(); double valor = sc.nextDouble(); // Faça alguma coisa com "id" e "valor". } [/quote]

o id vai ser sempre numerico.

Nossa, nem sabia que a classe scanner lia arquivos externos, achava que no maximo escrevia. Mas agora lembrei que ela é subclasse do java.io, certo?

Mas a classe Scanner não escreve nada, ela só lê, por isso o nome.

E ela faz parte do pacote java.util

Um exemplo bom simples de como ler um arquivo, talvez lhe ajude.

http://www.portaldaprogramacao.com/artigos2.asp?n=878

No caso de XMLs eu entendo, fica bem trabalhoso ler com Scanner, mas e CSVs? prefere usar um BufferedReader?

CSVs são cheios de casos particulares, nesse caso eu uso um java.io.StreamTokenizer (por exemplo, digamos que você tem um CSV separado por vírgulas, com campos string, cercado por aspas, e que tem uma vírgula no meio. StreamTokenizer toma conta desses casos, mas Scanner não consegue pegar esse caso.

vou tentar colocar o codigo que eu tenho ateh agora.

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.Scanner;
 
public class Despesa {
 
  public static void main(String[] args) {
    Scanner ler = new Scanner(System.in);
 
    System.out.printf("Informe o nome de arquivo texto:\n");
    String nome = ler.nextLine();
 
    System.out.printf("\nConteúdo do arquivo texto:\n");
    try {
      FileReader arq = new FileReader(nome);
      BufferedReader lerArq = new BufferedReader(arq);
 
      String linha = lerArq.readLine(); // lê a primeira linha
// a variável "linha" recebe o valor "null" quando o processo
// de repetição atingir o final do arquivo texto
      while (linha != null) {
        System.out.printf("%s\n", linha);
 
        linha = lerArq.readLine(); // lê da segunda até a última linha
      }
 
      arq.close();
    } catch (IOException e) {
        System.err.printf("Erro na abertura do arquivo: %s.\n",
          e.getMessage());
    }
 
    System.out.println();
  }
}

consigo ler numa boa, porem, nao cosigo ler com o “split” do 50010001 453.54 . ele soh le o 50010001.

Fiz uma forma simples, espero que ajude!!!

boa sorte

public class lerArquivo {  
  
             public static void main(String[] args) {  
  
        File file = new File("G:/daniel.txt");  
                try {  
                  FileReader reader = new FileReader(file);  
                  BufferedReader input = new BufferedReader(reader);  
                  String linha;  
                  while ((linha = input.readLine()) != null) {  
                    System.out.println(linha);  
                  }  
                  input.close();  
                } catch (IOException ioe) {  
                   System.out.println(ioe);  
                }  
  
    }  
  
}  

[quote=snowblacksoul]Fiz uma forma simples, espero que ajude!!!

boa sorte

public class lerArquivo {  
  
             public static void main(String[] args) {  
  
        File file = new File("G:/daniel.txt");  
                try {  
                  FileReader reader = new FileReader(file);  
                  BufferedReader input = new BufferedReader(reader);  
                  String linha;  
                  while ((linha = input.readLine()) != null) {  
                    System.out.println(linha);  
                  }  
                  input.close();  
                } catch (IOException ioe) {  
                   System.out.println(ioe);  
                }  
  
    }  
  
}  

[/quote]

com certeza ajudou sim. mas o que eu nao consigo eh usar o split no meu arquivo. Dentro do meu arquivo eu tenho dados como:

50011025 455.45
50012451 512.01
50114587 555.40

vlw

Por quê não consegue fazer o split?

Tente assim:

                try {    
                  FileReader reader = new FileReader(file);    
                  BufferedReader input = new BufferedReader(reader);    
                  String linha;
                  String[] split;    
                  while ((linha = input.readLine()) != null) {
                    split = linha.split(" ");    
                    System.out.println(split[0]);
                    System.out.println(split[1]);    
                  }    
                  input.close();    
                } catch (IOException ioe) {    
                   System.out.println(ioe);    
                }

[quote=felipeaps]Por quê não consegue fazer o split?

Tente assim:

try { FileReader reader = new FileReader(file); BufferedReader input = new BufferedReader(reader); String linha; String[] split; while ((linha = input.readLine()) != null) { split = linha.split(" "); System.out.println(split[0]); System.out.println(split[1]); } input.close(); } catch (IOException ioe) { System.out.println(ioe); } [/quote]

Felipeaps mto obrigado pela ajuda. Eu pensei que ia dar certo. Mas ele dah um erro aqui “Exception in thread “main” java.lang.ArrayIndexOutOfBoundsException: 1
at Despesa.main(Despesa.java:23)”.

segue meu codigo:

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.Scanner;
 
public class Despesa {
 
  public static void main(String[] args) {
    Scanner ler = new Scanner(System.in);
 
    System.out.printf("Informe o nome de arquivo texto:\n");
    String nome = ler.nextLine();
 
    System.out.printf("\nConteúdo do arquivo texto:\n");
    try {
      FileReader arq = new FileReader(nome);
      BufferedReader lerArq = new BufferedReader(arq);
      String linha;
      String[] split;
            while ((linha = lerArq.readLine()) != null) {
            	split = linha.split(" ");
            	System.out.println(split[0]);
            	System.out.println(split[1]);
    	    }
            lerArq.close();
    		} catch (IOException e) {
    			System.out.println(e);
    }
  }
}

Se está dando essa excessão, significa que seu array de String, o String[] split;, só possui 1 posição, ou seja, quando tenta-se executar o System.out.println(split[1]);, que seria pegar a segunda posição do array, não é possível.

Provavelmente seu arquivo não é inteiro do jeito que vc informou. É necessário fazer verificações. Este código que enviei foi só pra exemplificar.

blz felipe, vou ver aqui o que eu faço. obrigado pela ajuda.