[RESOLVIDO] Ajuda para criar aplicação que lê e escreve arquivos CSV

Quem deve controlar é a Classe Menu, pois ela é a chamadora da consulta que é realizada através do método ler.
O resultado da consulta é retornado para a classe principal que informa o usuário e aguarda nova opção ou 4 para sair.

Entao eu poderia tirar esse try , o if deixar somente o while retornar estes dados e no menu eu deixo meu if para controlar os dados que serão mostrados?

O try … catch tem que ficar, pois está buscando dados de arquivo externo e o erro precisa ser capturado pela Exception.
O if pode migrar para o menu como um retorno do método.
Só para vc entender, o usuário indica 1, a classe principal pelo switch direciona para o case correto. As ações são realizadas pelos métodos da Classe Consulta e o resultado retorna para o menu com os dados a serem informados para o usuário ou registro não encontrado e volta para o menu para nova seleção do usuário.

Agora eu travei na hora de retorna esses dados e montar o if no menu, vou descansar um pouco e mais tarde eu tento denovo, no caso pra utilizar a classe que ta na package modelo, eu preciso fazer o import para meu menu ou basta somente fazer o import modelo.ConsultaChamados desta forma?

Pode importar desta forma e instanciar
ConsultaChamados consulta = new ConsultaChamados(); para que possa facilmente trazer os métodos quando apertar o sinal de ponto.
Por exemplo:
consulta., a IDE vai lhe sugerir os métodos disponíveis e daí seleciona
consulta.lerChamadosCSV(chamadoID, chamadoCSV);

Beleza eu tirei o if

public static void leChamadosCSV(String chamadoID, String chamadoCSV)

  {
  
	  boolean ResultadoEncontrado = false;
	  
	  String linha = "";
	  String delimitador = ";";
	  BufferedReader scan = null;
	  
	  	try
	  	{
		  
	  	scan = new BufferedReader(new FileReader(chamadoCSV));
	  	
	  	while((linha = scan.readLine()) != null)
	  	{
			  
	  		String[] linhas = linha.split(delimitador);
	  	}
	  	
		} 	
	  	catch(Exception E)
		{
	  		System.out.println("ERRO: " + E.getMessage());
		}
  }

Ai a classe lê e retorna os dados, porem quero guarda-los em arraylist eu posso fazer tipo, return []ListaChamados ? Aí lá no meu eu exibo o array e coloco o if, mas não to sabendo como construir

E como eu acesso os meus recursos dentro do packet recurso pra passa-los como parametros, tipo como fica o caminho dele dentro do meu projeto?

No seu método lerChamadosCSV este if dentro o while estava quase no caminho

O if que pode comentar é este aqui:

Bom, como vc já criou a entidade Chamados, precisa enviar os dados obtidos com a para os setters da sua classe Chamados.

Para isto, terá que modificar o seu método lerChamadosCSV para:

public List<Chamados> lerChamadosCSV(String chamadoID, String chamadoCSV) {

Depois, adiciona uma linha criando uma lista para os chamados.

List<Chamados> listaChamados = new ArrayList<>();

No seu while adicione o trecho abaixo e retorne a lista no final do seu método.

    if (dados.length > 0) {
        Chamados chamados = new Chamados();
        chamados.setChamadoID(dados[0]);
        chamados.setDescricao(dados[1]);
        chamados.setDataAbertura(dados[2]);
        chamados.setCusto(dados[3]);
        listaChamados.add(chamados);
    }

Poste o resultado para ver como ficou.

No menu, na opção 1 vc chama o método do pacote assim:
Fora do while e próximo do public static void main coloque esta linha:

ConsultaChamados consultaChamados = new ConsultaChamados();

Depois, dentro do case 1, chama o método do seu pacote (ajuste o que for necessário, faça os imports):

List<Chamados> listaChamados = new ArrayList<>();
listaChamados = consultaChamados.lerChamadosCSV(chamadoID, chamadosCSV);
consultaChamados.mostraChamados(chamadoID, listaChamados);

No seu modelo ConsultaChamados comente o seu método de mostrarChamados e coloque este aqui:

public void mostraChamados(String chamadoID, List listaChamados) {
        for (int i = 0; i < listaChamados.size(); i++) {
            Chamados chamados = (Chamados) listaChamados.get(i);
            if (chamados.getChamadoID().equals(chamadoID)) {
                System.out.println("\nID: " + chamados.getChamadoID() + "\n" + "Descricao: " + chamados.getDescricao() + "\n"
                        + "Data de abertura: " + chamados.getDataAbertura() + "\n" + "Custo: " + chamados.getCusto());
            }
        }
    }

Ai no case1 eu posso já começar a pegar o id que o usuário irá digitar e o caminho de chamados CSV certo?

package visao;

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

import entidade.Chamados;
import modelo.ConsultaChamados;

public class Menu {

public static void main(String[] args) {

  ConsultaChamados consultaChamados = new ConsultaChamados();
  
  Scanner scan = new Scanner(System.in);
  
  System.out.println("------------------------------------------------");
  System.out.println("  Bemvindo ao sistema de consulta de chamados   ");
  System.out.println("------------------------------------------------\n");
  System.out.println("Selecione uma opção para continuar: \n");
  System.out.println("Digite 1 para consultar ");
  System.out.println("Digite 2 para salvar ");
  System.out.println("Digite 3 para carregar ");
  System.out.println("Digite 4 para sair \n");
  
  int opcao = scan.nextInt();
  boolean opcaoValida = true;
  
  	while(opcao == 0 || opcao > 4) {
  		System.out.println("Digite uma opção válida ! \n");
  		opcao = scan.nextInt();		

  	}	

  if(opcao > 0 || opcao <= 4) {	
  	
  		switch(opcao){
  			
  		//Caso 1  - Chama função que recupera os dados do arquivo CSV
  		case 1:
  		{				
  			List<Chamados> listaChamados = new ArrayList<>();
  			listaChamados = consultaChamados.leChamadosCSV(chamadoID, chamadosCSV);
  			consultaChamados.mostraChamados(chamadoID, listaChamados);
  			break;
  		}
  			
  		case 2:{
  			System.out.println("Opcao 2 selecionada");
  			break;
  		}
  			
  		case 3:{
  			System.out.println("Opcao 3 selecionada");
  			break;
  		}
  		
  		case 4:{
  			System.out.println("Obrigado por utilizar minha aplicação, saindo... \n");
  			opcaoValida = false;
  		}
  		
  		default:{
  			System.out.println("Erro desconhecido \n");
  			opcaoValida = false;
  		}
  		
  	}
  }

}
}

Classe Consulta:
Agora ele me diz que preciso criar os metodos getters e setters mas nao sei com o que devo popula-los, no caso seria com um scan para capturar o que o usuario digitar ou eu faço isso no menu?

package modelo;

import java.io.BufferedReader;
import java.io.FileReader;
import java.util.List;

import entidade.Chamados;

public class ConsultaChamados

{
public void mostraChamados(String chamadoID, List listaChamados)
{
for (int i = 0; i < listaChamados.size(); i++)
{
Chamados chamados = (Chamados) listaChamados.get(i);

        if (chamados.getChamadoID().equals(chamadoID))
        {
            System.out.println(
            		"\nID: " + chamados.getChamadoID() +
            		"\n" + "Descricao: " + chamados.getDescricao() +
            		"\n" + "Data de abertura: " + chamados.getDataAbertura() +
            		"\n" + "Custo: " + chamados.getCusto()
            );
        }
    }
}

public static void leChamadosCSV(String chamadoID, String chamadoCSV)

{

    boolean ResultadoEncontrado = false;
    
    String linha = "";
    String delimitador = ";";
    BufferedReader scan = null;
    
    	try
    	{
  	  
    	scan = new BufferedReader(new FileReader(chamadoCSV));
    	
    	while((linha = scan.readLine()) != null)
    	{
  		  
    		String[] linhas = linha.split(delimitador);
    	}
    	
  	} 	
    	catch(Exception E)
  	{
    		System.out.println("ERRO: " + E.getMessage());
  	}
}

}

Isto mesmo.
Devolve para o case1 o seu código que vc removeu.

        System.out.println("Opcao 1 selecionada");
        System.out.println("Por favor, informe o ID do chamado: ");

        //Pega o ID em forma de INT e transforma em String
        String chamadoID = Integer.toString(scan.nextInt());

Vai popular os setters conforme lhe expliquei na resposta 28.

Agora eu me confundi todo com o código, minha classe está assim:

package modelo;

import java.io.BufferedReader;
import java.io.FileReader;
import java.util.List;

import entidade.Chamados;

public class ConsultaChamados

{
public void mostraChamados(String chamadoID, List listaChamados)
{
for (int i = 0; i < listaChamados.size(); i++)
{
Chamados chamados = (Chamados) listaChamados.get(i);

        if (chamados.getChamadoID().equals(chamadoID))
        {
            System.out.println(
            		"\nID: " + chamados.getChamadoID() +
            		"\n" + "Descricao: " + chamados.getDescricao() +
            		"\n" + "Data de abertura: " + chamados.getDataAbertura() +
            		"\n" + "Custo: " + chamados.getCusto()
            );
        }
    }
}

public List lerChamadosCSV(String chamadoID, String chamadoCSV)

{

    boolean ResultadoEncontrado = false;
    
    String dados = "";
    String delimitador = ";";
    BufferedReader scan = null;
    
    	try
    	{
  	  
    	scan = new BufferedReader(new FileReader(chamadoCSV));
    	
    	while((dados = scan.readLine()) != null)
    	{
  		  
    	    if (dados.length > 0) {
    	        Chamados chamados = new Chamados();
    	        chamados.setChamadoID(dados);
    	        chamados.setDescricao(dados);
    	        chamados.setDataAbertura(dados);
    	        chamados.setCusto(dados);
    	        listaChamados.add(chamados);
    	    }
    	}
    	
  	} 	
    	catch(Exception E)
  	{
    		System.out.println("ERRO: " + E.getMessage());
  	}
}

}

Antes deste código coloca a linha do List
List<Chamados> listaChamados = new ArrayList<>();

Antes da última } coloque
return listaChamados;

Depois executa o menu para ver o resultado .

image
image

Estou com estes problemas aqui , por conta da falta desses getters e setters que não entendi como fazer.

Precisa criar os getters e setters na classe Chamados.
No Eclipse, estando na classe Chamados segue este exemplo.
https://www.mkyong.com/eclipse/generate-getters-and-setters-in-eclipse-ide/

Faltou fazer aquilo que lhe falei na resposta 30.

Recoloque o seu código acima na classe Menu para localizar o arquivo CSV.

Agora o menu está legível para mim segue o código:

package visao;

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

import entidade.Chamados;
import modelo.ConsultaChamados;

public class Menu {

public static void main(String[] args) {

  ConsultaChamados consultaChamados = new ConsultaChamados();
  
  String chamadosCSV = "recursos/Chamados.csv";
  
  Scanner scan = new Scanner(System.in);
  
  System.out.println("------------------------------------------------");
  System.out.println("  Bemvindo ao sistema de consulta de chamados   ");
  System.out.println("------------------------------------------------\n");
  System.out.println("Selecione uma opção para continuar: \n");
  System.out.println("Digite 1 para consultar ");
  System.out.println("Digite 2 para salvar ");
  System.out.println("Digite 3 para carregar ");
  System.out.println("Digite 4 para sair \n");
  
  int opcao = scan.nextInt();
  boolean opcaoValida = true;
  
  	while(opcao == 0 || opcao > 4) {
  		System.out.println("Digite uma opção válida ! \n");
  		opcao = scan.nextInt();		

  	}	

  if(opcao > 0 || opcao <= 4) {	
  	
  		switch(opcao){
  			
  		//Caso 1  - Chama função que recupera os dados do arquivo CSV
  		case 1:
  		{	  
  			//Pede ao usuário para informar o ID do chamado
  			System.out.println("Por favor, informe o ID do chamado: ");
  			
  			//A variavel aqui chama scan2 pois já existe outra variável com o nome scan
  			Scanner scan2 = new Scanner(System.in);	
  			
  			//Pegamos o ID em forma de INT e transformamos em String
  			String chamadoID = Integer.toString(scan2.nextInt());	
  			
  			//Criamos nosso ArrayList
  			List<Chamados> listaChamados = new ArrayList<>();
  			
  			//Recebemos o resultado da classe e o armazenamos na ArrayList
  			
  			listaChamados = consultaChamados.lerChamadosCSV(chamadoID, chamadosCSV);
  			consultaChamados.mostraChamados(chamadoID, listaChamados);
  			break;
  		}
  			
  		case 2:{
  			System.out.println("Opcao 2 selecionada");
  			break;
  		}
  			
  		case 3:{
  			System.out.println("Opcao 3 selecionada");
  			break;
  		}
  		
  		case 4:{
  			System.out.println("Obrigado por utilizar minha aplicação, saindo... \n");
  			opcaoValida = false;
  		}
  		
  		default:{
  			System.out.println("Erro desconhecido \n");
  			opcaoValida = false;
  		}
  		
  	}
  }

}
}

A minha classe está assim:

package modelo;

import java.io.BufferedReader;
import java.io.FileReader;
import java.util.ArrayList;
import java.util.List;

import entidade.Chamados;

public class ConsultaChamados

{
public List lerChamadosCSV(String chamadoID, String chamadoCSV)

{

    boolean ResultadoEncontrado = false;
    List<Chamados> listaChamados = new ArrayList<>();
    
    String dados = "";
    String delimitador = ";";
    BufferedReader scan = null;
    
    	try
    	{
  	  
    	scan = new BufferedReader(new FileReader(chamadoCSV));
    	
    	while((dados = scan.readLine()) != null)
    	{
  		  
    	    if (dados.length > 0) {
    	        Chamados chamados = new Chamados();
    	        chamados.setChamadoID(dados);
    	        chamados.setDescricao(dados);
    	        chamados.setDataAbertura(dados);
    	        chamados.setCusto(dados);
    	        listaChamados.add(chamados);
    	    }
    	}
    	
  	} 	
    	catch(Exception E)
  	{
    		System.out.println("ERRO: " + E.getMessage());
  	}
    	
    	return listaChamados;
}

public void mostraChamados(String chamadoID, List listaChamados)
{
for (int i = 0; i < listaChamados.size(); i++)
{
Chamados chamados = (Chamados) listaChamados.get(i);

        if (chamados.getChamadoID().equals(chamadoID))
        {
            System.out.println(
            		"\nID: " + chamados.getChamadoID() +
            		"\n" + "Descricao: " + chamados.getDescricao() +
            		"\n" + "Data de abertura: " + chamados.getDataAbertura() +
            		"\n" + "Custo: " + chamados.getCusto()
            );
        }
    }
}

}

E os getters e setters da Classe Chamado estão aqui:

package entidade;

public class Chamados {

private String dados;

public void setChamadoID(String dados) {
this.dados = dados;
}

public Object getChamadoID() {
return getChamadoID();
}

public String getDescricao() {
return getDescricao();
}

public String getDataAbertura() {
return getDataAbertura();
}

public String getCusto() {
return getCusto();
}

public void setDescricao(String dados) {
this.dados = dados;
}

public void setDataAbertura(String dados) {
this.dados = dados;
}

public void setCusto(String dados) {
this.dados = dados;
}

}

Rodei o código e o resultado foi:


Bemvindo ao sistema de consulta de chamados

Selecione uma opção para continuar:

Digite 1 para consultar
Digite 2 para salvar
Digite 3 para carregar
Digite 4 para sair

1
Por favor, informe o ID do chamado:
76729
ERRO: recursos\Chamados.csv (O sistema não pode encontrar o caminho especificado)

Tentei mudar o caminho que está recursos/Chamados.csv para Chamados.csv mas não adiantou, ai fica minha dúvida, posso navegar por eles assim como por exemplo chamo um script em uma página web ?

Copie os arquivo CSV para a raiz do seu projeto e rode novamente.

Estranho, mesmo aqui ele não encontra o arquivo.

image

Mas alterou a string para ficar como “Chamados.csv”?

1 curtida