Lendo um arquivo .txt e transformando em DAO

Olá gente;
Tenho a seguinte duvida, preciso importar uma arquivo .txt para Java. Até aí td bem…mas meu problema é que
preciso transformar agora esse arquivo depois de lido em uma classe DAO para inserir o texto em uma PROCEDURE.
Estou procurando pela NET se alguem já teve uma situação assim como exemplo, mas ainda não tive sucesso.
Eis a importação:

i[code]mport java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;

public class NovoTeste {

public static void main(String[] args) throws IOException {

	try {
		// FileReader para o arquivo:
		FileReader fr = new FileReader("C:/Documents and Settings/arthur.gomes/Desktop/cliente.txt");
		// BufferedReader para o FileReader:
		BufferedReader br = new BufferedReader(fr);
		String temp;
		// A cada iteração, l~e uma linha do arquivo e atribui-a a temp:
		while ((temp = br.readLine()) != null) {
			// Aqui vc gera a sua "lista". No caso, imprimi cada linha na
			// tela.
			System.out.println(temp + "\n");
		}
	} catch (FileNotFoundException e1) {
		System.out.println("File not found!");
	}
}

}
[/code]

Até aqui td bem. Me imprime o texto no console. Mas agora…como transformo esse texto em uma classe DAO?

Obrigado.

Não entendi porque você precisa fazer essa conversão, acho que está confundindo as coisas, não?

http://www.javafree.org/content/view.jf?idContent=183

Então…eu tava lendo justamente esse link que vc me passou. Como não tenho experiência com “pattern DAO”,
to tentando entender. Na verdade é idéia é que uma Procedure leia o arquivo .txt…mas pelo que me passaram, eu preciso importar o arquivo antes…como aliás fiz. Depois formar uma classe DAO desse arquivo para poder chamar a Procedure.

Olá…fazendo uma correção…preciso importar o arquivo .txt e transformar em uma classe BEAN. Aí sim que farei a classe DAO.
Se alguem puder me ajudar…agradeço.

Cara não entendi muito.

1° Pq tem que ser uma procedure para ler este arquivo e não o próprio java?

2° Eu faria a parte de negócio no próprio java ao invés de usar uma proc.

3° Porque tens que criar o Bean a partir desse arquivo? As informações do cliente que virão desse arquivo não serão sempre as mesmas?

4° O DAO serve para criar os teus métodos que farão a persistência com o banco de dados.

Tem uma documentação que fala do DAO

http://java.sun.com/blueprints/corej2eepatterns/Patterns/DataAccessObject.html

Inclusive um tópico de quando deve ser criado o DAO

http://www.guj.com.br/posts/list/27202.java

Flw

Aí que está…gostaria tbm de poder fazer do jeito mais simples…uma vez que conheço as informações no BEAN, mas a idéia é q importe o arquivo .txt…converta para uma classe Java (BEAN) e com essa classe farei o DAO no qual vou inserir as informações na devida PROCEDURE.
Li algo sobre importar arquivos txt e até já fiz os testes…mas e pra converter para uma classe Bean? Conhece algum tutorial?

Valeu.

[quote=arthurgon]Olá gente;
Tenho a seguinte duvida, preciso importar uma arquivo .txt para Java. Até aí td bem…mas meu problema é que
preciso transformar agora esse arquivo depois de lido em uma classe DAO
[/quote]

A coisa é ao contrário. Supondo que o texto contem dados de cliente então vc tem que criar objetos cliente, popular esses objetos com os dados do arquivo. Quando alguem consultar o DAO vc retorna esses objetos. algo assim


public class TxtFileClientDAO  {

   private String filePath; // "C:/Documents and Settings/arthur.gomes/Desktop/cliente.txt"

    public synchronized  Collection<Client> findAll(){

    try {  
            Collection<Client> clients = new LinkedList<Client>();

             FileReader fr = new FileReader(filePath);  
             // BufferedReader para o FileReader:  
             BufferedReader br = new BufferedReader(fr);  
             String line;  

            while ((line = br.readLine()) != null) {  
                  Client client = new Client();
                    // faz o parse da linha e seja valores , por exemplo se fosse separado por ; 
                    String[] fields = line.split(";");
                      client.setName(fields[0]);
                         ... // etc .. 
                      clients.add(client);
             }  
          } catch (FileNotFoundException e) {  
             throw new DAOException(e);
         }  catch (IOException e) {  
             throw new DAOException(e);
         }  
    }
}

Voc pode bufferizar a lista ou seja, carrega apenas uma vez e manter na memoria. Se o arquivo muda esse tecnica é falha, mas pode usar algum tipo de file watcher para ser avisado que o arquivo mudor e recarregar conforme.

Cara valeu…vou testar aqui. Eu falo o resultado.

Abraço.

Cara eu to usando Java 1.4 por necessidade do projeto. A aplicação pede que eu converta para Java 5.
Como faço para corrigir os erros? Estão dando justamente em COLLECTION e nas tags do List.

Ficou assim o meu código…sendo MensagemVO como a classe Bean que criei. Pra ser honesto ainda não entrou na minha cabeça o conceito de importar um .txt ,criar objetos e popular com os dados do .txt. Esses objetos eu crio na mão como uma classe Bean. É isso? No meu caso a MensagemVO.

[code]import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.Collection;
import java.util.LinkedList;

public class MensagemDAO {

 private String filePath; // "C:/Documents and Settings/arthur.gomes/Desktop/P2DAQ014.txt"  
   
     public synchronized  Collection<MensagemVO> findAll(){  
   
     try {    
             Collection<MensagemVO> mensagens = new LinkedList<MensagemVO>();  
   
              FileReader fr = new FileReader(filePath);    
              // BufferedReader para o FileReader:    
              BufferedReader br = new BufferedReader(fr);    
              String line;    
   
             while ((line = br.readLine()) != null) {    
            	 MensagemVO mensagem = new MensagemVO();  
                       
                     String[] fields = line.split(";");  
                   
                        //Justamente aqui que ficam minhas dúvidas,como populo esse objeto com os dados do .txt? 
                         mensagem.setCod_msg(fields[0]); 
                     
                     
                     mensagens.add(mensagem);  
              }    
           } catch (FileNotFoundException e) {    
              throw new Exception(e);  
          }  catch (IOException e) {    
              throw new Exception(e);  
          }    
     }  
 }  [/code]

[quote=arthurgon]Cara eu to usando Java 1.4 por necessidade do projeto. A aplicação pede que eu converta para Java 5.
Como faço para corrigir os erros? Estão dando justamente em COLLECTION e nas tags do List.
[/quote]

Se está usando 1.4 e não o 5, retire tudo o que estiver entre <> O 1.4 não tem generics.

Como popular o objeto com os dados ? Ora, vc tem que saber que dados estão no arquivo e em que formato ( ordem , etc…)
Ou seja, vc tem que conhecer o protocolo do arquivo. Ai vc lê e processa as informações para serem colocados no objeto
Se forem necessárias conversões ( para numeros ou datas) faça-as.

Exemplo de arquivo : 1 linha é um objeto

Maria Esteves;23042008;98;Olá, como está ?,true
João Limeira;12072008;98;Segundo cara,false

// processamento do arquivo


String[] fields = line.split(";");
MensagemVO mensagem = new MensagemVO();
SimpleDateFormat dformat = new SimpleDateFormat("ddMMyyyy");

mensagem.setNome(fields[0]) // 0 porque é a primeira coluna

Date envio = dformt.parse(fields[1]); // segunda coluna
mensagem.setEnvio(envio ) 

int prioridade = Integer.parseInt(fields[2]); // segunda coluna
mensagem.setPrioridade(prioridade) ;

mensagem.setTexto(fields[3]) ;

mensagem.setExterno(fields[4]).equals("true") ;

Não entendo qual seja a dificuldade…

É a primeira vez que faço esse tipo de trabalho. É como andar de patins…depois que aprende não esquece mais.
A dificuldade é só na primeira aplicação…mas vou conseguir.

Valeu.

Dai amigo admiro teu esforço, pelo que vejo você esta meio confuso realmente em algumas coisas. Não sem quem falou que você precisava dessa proc para o projeto, mas isso não é necessário cara você deverá criar um padrão para o arquivo, pois tu não esta trabalhando com ontologia, portanto vais ter que dizer que o teu .txt esta com o formato X por exemplo, depois de estabelecer este formato tens que fazer o teu programa algo como o sergio postou pra você, lógico que isto depende do conteúdo que você vai ter no teu .txt se cada campo vai ser separado por “;” ou qualquer outro caracter para que tu possa identificar o que é o nome do cliente, idade, código etc.

Dai você me diz - Paulo a questão é que a minha proc já esta pronta com o inser montado, mesmo que isto já esteja pronto você vai precisar que o arquivo .txt esteja com um padrão se não a proc não vai saber quem é quem, tipo (nome cliente, idade, código etc)

Quando tu tiveres o padrão para o txt poderás criar o Bean.

Por exemplo.

Vai ter que ter no txt as seguintes informações:

Código do Cliente
Nome do Cliente
Idade
Sexo

A partir disso vai criar o teu bean:

Algo como.

class BeanCliente {

private Integer codigoCliente;
private String nomeCliente
private Integer idade;
private Char sexo;

// aqui vais os geters e seters dos respectivos atributos. 

}

Depois de ter o teu bean e o teu txt padronizado deverás criar o teu programa para ler o teu txt algo como o exemplo que o nosso amigo Sérgio postou.

O teu DAO servira para criar o método incluir por exemplo.

Da uma lida no blog do amigo Sérgio que paticularmente achei muito bom, já que ele não fez a propaganda eu faço hehe.

Abraço.

Cara,

Dá uma olhada na JFileHelpers: http://jfilehelpers.com

Veja os exemplos!

Abraços.

Olá meus amigos;

Ainda não deu certo. Estou tendo um erro acredito eu de formatação do texto.
Segue o erro:

java.lang.NumberFormatException: For input string: "CAMPO" at java.lang.NumberFormatException.forInputString(NumberFormatException.java:48) at java.lang.Integer.parseInt(Integer.java:468) at java.lang.Integer.parseInt(Integer.java:518) at testes.MensagemDAO.main(MensagemDAO.java:25) Exception in thread "main"

Fora isso…o código ficou dessa forma:

[code]import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.sql.SQLException;

public class MensagemDAO {

 public static void main(String[] args) throws Exception,SQLException {
   
     try {    
       
    		FileReader fr = new FileReader("C:/Documents and Settings/arthur.gomes/Desktop/P2DAQ014.txt");
    		     // BufferedReader para o FileReader:    
              BufferedReader br = new BufferedReader(fr);    
              String line;    
   
             while ((line = br.readLine()) != null) {    
            	 MensagemVO vo = new MensagemVO();  
                       
                  String[] fields = line.split(";");  
                    
                   int cod_msg = Integer.parseInt(fields[0]);
     				vo.setCod_msg(cod_msg);
     				
     				vo.setDescr_msg(fields[1]);
     				
     				int cod_emp = Integer.parseInt(fields[2]);
     				vo.setCod_emp(cod_emp);
     				
     				int cod_fil = Integer.parseInt(fields[3]);
     				vo.setCod_fil(cod_fil);
     				
     				int cod_tiplis = Integer.parseInt(fields[4]);
     				vo.setCod_tiplis(cod_tiplis);
     				
     				vo.setTs_tiplis(fields[5]);
     				 
     				  //mensagens.add(vo); 
     				
     				System.out.println(line + "\n");
     				 
              }    
           } catch (FileNotFoundException e) {    
              throw new Exception(e);  
          }  catch (IOException e) {    
              throw new Exception(e);  
          }    
    
 }  

}
[/code]

Será que alguem poderia me ajudar? Aliás…nesse caso…como faço para inserir todos esses objetos numa lista? To usando Java 1.4(Exigencia da aplicação).
Valeu gente.

Para o seu caso, o JFileHelpers cai como uma luva. Você teria apenas que anotar a classe MensagemVO, dizendo que você vai usar registros delimitados e depois mapear os campos.

Algo como o exemplo do JFileHelpers:

@DelimitedRecord(",")
public class Customer {
	private Integer custId;
	private String name;
	private Integer rating;
	
	@FieldConverter(converter = ConverterKind.Date, format = "dd-MM-yyyy")
	private Date addedDate;
	
	@Override
	public String toString() {
		String l = System.getProperty("line.separator");
		StringBuffer b = new StringBuffer();
		b.append("Customer: ").append(l);
		b.append("   custId = " + custId).append(l);
		b.append("   name = " + name).append(l);
		b.append("   rating = " + rating).append(l);
		b.append("   addedDate = " + addedDate).append(l);
		return StringHelper.toStringBuilder(this, b.toString());
	}
}

Depois é só fazer:

	public static void main(String[] args) throws IOException {
		FileHelperEngine<Customer> engine = new FileHelperEngine<Customer>(Customer.class);	
		List<Customer> customers = new ArrayList<Customer>();
		
		if (args.length < 1) {
			customers = engine.readResource("/samples/customers-delimited.txt");
		}
		else {
			customers = engine.readFile(args[0]);
		}
		
		for (Customer c : customers) {
			System.out.println(c);
		}
	}

Espero que te ajude…

Abraços!

Esquece… JFileHelpers precisa de 1.5 por usar anotações. Talvez no futuro tenhamos suporte via XML também.

Que pena! :slight_smile:

Abraços!

Então…mas rola pra Java 1.4?

Td bem…mas com Java 1.4 como vc me recomendaria? Tem solução?

Abraço.

Cara esse erro ocorreu pq você ta tentando Formatar um numero mas o que ta vindo é uma String.

Abraço.

Você vai ter que continuar no caminho indicado pelos outros que responderam, fazer mais “na mão” mesmo.