Ler arquivo CSV and criar POJO

Bom dia a todos,

Eu estou começando a aprender JAVA e um dos exercicios que estou tentando fazer é para ler um arquivo CSV e criar POJO com as informaçoes contidas no arquivo.

Eu consigo ler o arquivo CSV sem problemas usando o seguinte:

BufferedReader CSVFile; public void setCSVFile(String fileName){ CSVFile = new BufferedReader(new FileReader(fileName)); }

E tenho todos os meus Getters and Setters ja no programa para cada coluna das informaçoes do arquivo CSV (nome, idade,etc…).

Minha perguntas sao:

1) Como transformar o arquivo CSV em POJOs? Como definir cada coluna quando for passar os argumentos?

public CSVReader(String name, Integer age, Date dob, String gender, String natinoality){
	this.name = name;
	this.age = age;
	this.dob = dob;
	this.gender = gender;
	this.nationality = nationality;
}
	
private void setDataRow(){
   String line = null;
   while((line = CSVFile.readLine()) != null){
       obj = new CSVReader(??????);
   }
}

2) Provavelmente uma questao boba e talvez basica de OOP, mas parte do exercicio q estou fazendo sera criar um outro programa em JAVA que ira chamar este programa acima q le o arquivo CSV e usara as informacoes pra diferentes coisas. Como posso fazer isso? eu sei q seria chamando os getters mas como meu programa sabera quantos objetos foram criados, etc?

Muito obrigado pela ajuda
Emanuel

Bom dia

o arquivo CSV usa separador para delimitar as informações, vc pode usar o metodo “split” da classe String pra gerar um array com as informações de cada linha do seu arquivo e setar no seu POJO

String line = null;  
   while((line = CSVFile.readLine()) != null){
       String[] colunas = line.split(";");
       // settar no pojo 
       
       obj = new CSVReader(??????);  
   }

O termo certo seria criar um pojo ou popular um pojo?

E como o colega falou anteriormente, você lê cada linha o arquivo csv, dá um split na String pelo ponto-e-virgula, então seta manualmente cada valor na variável específica do objeto que você criou…

Primeiramente, valeu pelas respostas…

Entao o codigo seria algo assim:

public CSVReader(String name, Integer age, Date dob, String gender, String natinoality){  
    this.name = name;  
    this.age = age;  
    this.dob = dob;  
    this.gender = gender;  
    this.nationality = nationality;  
}  
      
private void setDataRow(){  
   String name;
   Integer age;
   ...

   String line = null;  
   while((line = CSVFile.readLine()) != null){  
       String[] colunas = line.split(";");
       name = colunas[0];
       age = colunas[1];
       ...
 
       CSVReader obj = new CSVReader(name, age, ...);  
   }  
} 

E quanto a minha outra pergunta (nao se esquecan q sou principiante in JAVA)? Como depois eu posso usar esses dados desde um outro arquivo Java? Como meu outro programa vai saber quantas linhas tinha meu CSV? Ou seja, o q acontecera no meu outro arquivo quando eu colocar la algo do tipo:

 String name = getName()

Valeu pela ajuda!!

seguindo a logica que vc montou, vc pode adicionar esses pojos em uma lista e quando vc precisar sabe a quantidade de pojos criados vc chamaria o metodo getSize da sua lista.
seria legal vc separar as coisas, pelo que eu vi seu metodo de leitura esta dentro de seu pojo, acho que o pojo não é o melhor local para isso.

Sou bem principiante em Java entao pra refazer minha pergunta para q eu possa aprender da forma correta é: qual é a melhor forma de ler um arquivo CSV e colocar o resultado em POJO que sera posteriormente usado em outros arquivos Java? Nao se preocupem em usar o codigo q eu estava usando antes mas sim qual seria a melhor forma de fazerlo.

Obrigado pela ajuda
Emanuel

Você poderia ter uma classe apenas para processar o arquivo e extrair os dados. E a classe pojo teria um construtor que recebe esses dados como parametro…

Obs: Você trata as excessões que aparecerão, ok?

public class ProcessaArquivo {

	public static List<String[]> retornaListaRegistros(String caminhoDoArquivo) {
	List<String[]> listaRegistros = new ArrayList<String[]>();

	File arquivoCSV = new File(caminhoDoArquivo);
	FileReader fr = new FileReader(arquivoCSV);
	BufferedReader br = new BufferedReader(fr);
   			       
	String linha;
	while ((linha = br.readLine()) != null) {
		String registro[] = linha.split(";");
		listaRegistros.add(registro);
	}

	return listaRegistros;
	}
}
public class Registro {

	private String valor1;
	private String valor2;
	private String valor3;
	// ...

	public Registro() {}

	public Registro(List<String[]> listaRegistros) {
		if (listaRegistros.size() > 0) {
			for (String registro[] : listaRegistros) {
				valor1 = registro[0];
				valor2 = registro[1];
				valor3 = registro[2];
				// E assim vai..
			}
		}
	}
}
public class Teste {
	public static void main(String args[]) {
		List<String[]> lista = ProcessaArquivo.retornaListaRegistros("c:\arquivo.csv");
		Registro reg = new Registro(lista);
		// ...
	}
}

ul1sses, sua implentação ficou legal, mas se eu não estiver enganado nessa implentação so exitirá apenas um registro

vou sugerir algumas alterações

    public class Registro {  
      
        private String valor1;  
        private String valor2;  
        private String valor3;  
        // ...  
      
        public Registro() {}  
      
        public Registro(String[] Registro) {  
            if (Registro.length> 0) {  
                
                    valor1 = registro[0];  
                    valor2 = registro[1];  
                    valor3 = registro[2];  
                    // E assim vai..  
                 
            }  
        }  
    }  

e no main ficaria assim

    public class Teste {  
        public static void main(String args[]) {  
           
            List<String[]> lista = ProcessaArquivo.retornaListaRegistros("c:\arquivo.csv");  
            for(String[] registro : lista){
           
                   Registro reg = new Registro(registro); 
                   //faz o que vc precisar com o registro

            }

                
            // ...  
        }  
    }  

Danilo/Ul1sses,

Obrigado pela ajuda ate o momento.

Outra pergunta, como faço agora pra usar, desde outros arquivos, os valores que estao na class Registro? Ou seja, imaginem q eu tenho outras 10 classes q vao usar o resultado do Registro. Algumas classes vao usar somente o valor1 e valor2, outra vai usar valor3, etc… Lendo na net eu imagino q precisaria ter Getters and Setters na classe Registro para q eu possa acessar desde outros arquivo, isto eh correto? Existe algum exemplo q eu possa dar uma olhada?

Valeu
Emanuel

Se você não quiser usar getters and setters é só colocar os atributos de Registro como public e acessá-los diretamente, mas a maioria das pessoas já tende a usar esses métodos (getter and setter) como padrão, mesmo as vezes sendo desnecessário. Então, fica à seu critério.

Vamos dizer q eu use os Getters and Setters como eu faria pra criar-los baseado no exemplo q vcs me mandaram? Ou melhor, minha pergunta seria, como eu sei q desde meus outros arquivos quando eu use o getValor1 ele vai me trazer todos os valores q eu tenho em cada linha do meu arquivo CSV (q é na verdade o que eu necessito pra esse exercicio)?
Obrigado

ps.: talvez pra ficar mais facil vou passar abaixo o exercicio q estou tentando fazer…

  1. Criar um arquivo CSV com algumas linhas de dados para colunas nome, idade, data nascimento, nacionalidade
  2. criar um arquivo java para ler o CSV e armazenar-los em POJO
  3. criar um arquivo java q acione o leitor CSV criado em passo 2 e imprima somente os dados da coluna nome
  4. criar um arquivo java q acione o leitor CSV criado em passo 2 e mude alguns valores da coluna nacionalidade usando Setters e imprima na tela o novo resultado
  5. criar um arquivo java q acione o leitor CSV criado em passo 2, mude alguns valores da coluna idade e re-escreva o arquivo CSV com os novos valores

etc…