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…
- Criar um arquivo CSV com algumas linhas de dados para colunas nome, idade, data nascimento, nacionalidade
- criar um arquivo java para ler o CSV e armazenar-los em POJO
- criar um arquivo java q acione o leitor CSV criado em passo 2 e imprima somente os dados da coluna nome
- 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
- 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…