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


Preciso criar esta aplicação da maniera que me foi solicitado na facul, porem estou com alguns problemas, eu criei o menu da minha aplicação, segue abaixo o código:

import java.util.Scanner;

public class Menu {
boolean sair;

public static void main(String[] args) {

  Menu menu = new Menu();
  menu.leOpcoesMenu();

}

public void leOpcoesMenu() {
printCabecalho();
while(!sair) {
printMenu();
int opcao = getInput();
executaAcao(opcao);
}
}

private void printCabecalho() {
System.out.println("------------------------------------------------");
System.out.println(" Bemvindo ao sistema de consulta de chamados “);
System.out.println(”------------------------------------------------\n");
}

private void printMenu() {
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”);
}

private int getInput() {

  Scanner leitor = new Scanner(System.in);
  int opcao = -1;
  
  while(opcao < 4) {
  	
  	try {
  		
  		System.out.println("Digite sua escolha: ");
  		opcao = Integer.parseInt(leitor.nextLine());
  		
  		
  	}catch(NumberFormatException e) {
  		
  		System.out.println("Opção inválida, selecione uma opção válida ! \n");
  		
  	}
  }
  
  return opcao;

}

public void executaAcao(int opcao) {

  switch(opcao) {
  	
  	case 1:
  		LerEscreverChamado leChamado = new LerEscreverChamado();
  		leChamado.LeChamadosCSV("Chamados.csv");
  		break;
  	case 2:
  		//Salva();
  		break;
  	case 3:
  		//Carrega();
  		break;
  	case 4:
  		sair = true;
  		System.out.println("Obrigado por utilizar minha aplicação kek \n");
  		break;
  	default:
  		System.out.println("Ocorreu um erro desconhecido. \n");
  }

}
}

E também já criei uma classe que lê e escreve no arquivo, segue:

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.PrintWriter;
import javax.swing.JOptionPane;

public class LerEscreverChamado {

public static void LeChamadosCSV(String arquivoCSV) {

  BufferedReader leitorCSV = null;
  	
  try {
  		
  	leitorCSV = new BufferedReader(new FileReader(arquivoCSV));
  	String linha = "";
  	leitorCSV.readLine(); // Remove a primeira linha (linha do título)
  	String[] linhaArray;
  	
  	while(( linha = leitorCSV.readLine() ) != null) {
  		linhaArray = linha.split(";"); // Converte string para array
  		
  		for(String s: linhaArray) {
  			System.out.println(s);
  		}
  		System.out.println("");
  	}
  }catch(Exception e) {
  	
  }
  
  return ;

}

public static void escreveNoArquivoCSV(String chamadoID, String Descricao, String DataAbertura, String Custo, String caminhoDoArquivo) {

  try {
  		
  	FileWriter fw = new FileWriter(caminhoDoArquivo, true);
  	BufferedWriter bw = new BufferedWriter(fw);
  	PrintWriter pw = new PrintWriter(bw);
  	
  			
  	pw.println(chamadoID + ";" + Descricao + ";" + DataAbertura + ";" + Custo + ";");
  	pw.flush();
  	pw.close();
  			
  	JOptionPane.showMessageDialog(null, "Chamado salvo com sucesso !");

  }catch(Exception E) {
  			System.out.println("Erro ao gravar chamado" + E.getMessage());
  }

}
}

O que acontece é que não estou conseguindo criar a interação que me foi pedida com o menu e a classe, não consigo exibir da maneira que está sendo pedido no exercício.

Olá!
Está no caminho.
Quebre o exercício em várias partes conforme o menu que deverá representar, respeitando as condições gerais e as específicas da seleção para cada opção do menu.
Exemplo:
Gerais

  • O exercício lhe dá 3 planilhas com estruturas similares a tabelas de um BD.
  • Use List, ArrayList e LinkedList, com classes de leitura de arquivo texto.
  • Classes e pacotes especializados para leitura de dados, validação e apresentação.
  • O método principal somente pode chamar as classes e métodos especializados.

Específico para o menu

  • Visualize o que deverá ocorrer quando o usuário selecionar uma das opções identificando as classes e métodos a serem criados/chamados para atender às condições gerais e a opção do menu.

Vai postando a evolução do código que vamos lhe auxiliando.

Beleza, refiz o menu pois estava com problemas no switch, aqui está:

import java.util.Scanner;

public class Menu {

public static void main(String[] args) {

  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:{
  			System.out.println("Opcao 1 selecionada");
  			break;
  		}
  			
  		case 2:{
  			System.out.println("Opcao 2 selecionada");
  			break;
  		}
  			
  		case 3:{
  			System.out.println("Opcao 3 selecionada");
  			break;
  		}
  		//Default - Sai da aplicação
  		default:{
  			opcaoValida = false;
  		}
  		}
  }

}
}

Agora vou trabalhar nas classes para realizar as ações.

import java.io.File;
import java.util.Scanner;
import javax.swing.JOptionPane;

public class Consulta
{

public static void ConsultaChamados()
{

  System.out.println("Por favor, informe o ID do chamado: ");
  
  //Pega o ID em forma de INT e transforma em String
  Scanner scan = new Scanner(System.in);		
  String chamadoID = Integer.toString(scan.nextInt());
  String arquivoCSV = "Chamados.csv";
  LeChamadosCSV(chamadoID, arquivoCSV);

}

public static void LeChamadosCSV(String chamadoID, String arquivoCSV)

  {
  
  boolean ResultadoEncontrado = false;
  
  String ID = "";
  String Descricao = "";
  String DataAbertura = "";
  String Custo = "";
  
  try
  {
  
  	Scanner scan = new Scanner(new File(arquivoCSV));
  	scan.useDelimiter(";");
  	
  	while(scan.hasNext() && !ResultadoEncontrado)
  	{
  		ID = scan.next();
  		Descricao = scan.next();
  		DataAbertura = scan.next();
  		Custo = scan.next();
  		
  		if(ID.equals(chamadoID)) {
  			ResultadoEncontrado = true;
  		}
  	}
  	
  	if(ResultadoEncontrado) {
  		System.out.println(
  		"ID: " + ID + "\n" +
  		"Descrição: " + Descricao + "\n" +
  		"Data de abertura: " + DataAbertura + "\n" +
  		"Custo: " + Custo + "\n"
  		);
  	}else {
  		JOptionPane.showMessageDialog(null,"Nenhum registro encontrado !");
  	}
  	
  }catch(Exception E) {
  	System.out.println("ERRO: " + E.getMessage());
  }

}
}

Terminei a consulta porem agora ele ta caindo no catch, e me dando ERRO: Null, alguem pode me ajudar? Tô tentando ler um arquivo csv , de acordo com o id digitado pelo usuario ele busca dentro do arquivo csv pelo id que o usuario digitou, deposita cada dado em variáveis e mostra para o usuário.

Preciso entregar hoje a noite e to meio sem prazo se alguem puder me ajudar, quebrei a cabeça aqui mas não sei porque do null.

Confere os dados do arquivo Chamados.csv, os quais devem estar separados por “;” e correspondentes ao tipo da variável setada.
Desculpe, no GUJ não fazemos as tarefas e exercícios de casa.

1 curtida

Problema anterior resolvido. Agora estou tentando arrumar minha classe para exibir os dados das planilhas.

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.util.Scanner;
import javax.swing.JOptionPane;

public class Consulta

{

public static void ConsultaChamados()
{

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

//Pega o ID em forma de INT e transforma em String
Scanner scan2 = new Scanner(System.in);
String chamadoID = Integer.toString(scan2.nextInt());
String chamadoCSV = “Chamados.csv”;
String lancamentosCSV = “Lançamentos.csv”;

LeChamadosCSV(chamadoID, chamadoCSV);
MostraLancamentos(chamadoID, lancamentosCSV);

}

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);
				
		if(linhas[0].equals(chamadoID))
		{
			ResultadoEncontrado = true;
			
			System.out.println
			(		
			"ID: " + linhas[0] + "\n" +
			"Descricao: " + linhas[1] + "\n" + 
			"Data de abertura: " + linhas[2] + "\n" + 
			"Custo: " + linhas[3] + "\n"
			);
			
		}

		if(ResultadoEncontrado == false) {
			System.out.println("Chamado não encontrado !");
		}
	}
	
	
  }
	
	catch(Exception E)
  {
		System.out.println("ERRO: " + E.getMessage());
  }

}

public static void MostraLancamentos(String chamadoID, String lancamentosCSV)

{
  
String linha = "";
String delimitador = ";";
BufferedReader scan = null;

	try
	{
    
	scan = new BufferedReader(new FileReader(lancamentosCSV));
	
    	while((linha = scan.readLine()) != null)
    	{
  		  
    		String[] linhas = linha.split(delimitador);
    				
    		if(linhas[0].equals(chamadoID))
    		{
    			System.out.println("-------------------Lançamento-------------------");
    			System.out.println
    			
    			(
   
    			"ID do Chamado: " + linhas[0] + "\n" +
    			"Data: " + linhas[1]
    			
    			);
    			
    			String statusID = linhas[2];
    			scan = new BufferedReader(new FileReader("Status.csv"));
				while((linha = scan.readLine()) != null)
				{
					linhas = linha.split(delimitador);
					if(statusID.equals(linhas[0]))
					{
    				System.out.println("Status do chamado: " + linhas[1] + "\n" );
					}
				}						
    						
			 }	
    	}
   }
	
	catch(Exception E)
  {
		System.out.println("ERRO: " + E.getMessage());
  }

}

}

E ao rodar o código ele me devolve:

Chamado não encontrado !
ID: 76729
Descricao: Problema na tela de funcionário
Data de abertura: 01/03/2018
Custo: 600.52

-------------------Lançamento-------------------
ID do Chamado: 76729
Data: 04/03/2018
Status do chamado: Construção da E.F pendente

Está fazendo tudo num único arquivo.
O exercício pede para utilizar pacotes, classes, List, ArrayList e LinkedList.
Separa tudo primeiro.
Primeiro, veja que possui três planilhas com registros e campos definidos.
Para manipular estes registros necessita de uma entidade (JavaBeans) para cada uma, em arquivos separados (Chamados, Status e Lancamentos), num pacote chamado entidade.
Exemplo:
public class Chamados {

    private String ID;
    private String Descricao;
    private String DataAbertura;
    private String Custo;

    public Chamados(String ID, String Descricao, String DataAbertura, String Custo) {
        this.ID = ID;
        this.Descricao = Descricao;
        this.DataAbertura = DataAbertura;
        this.Custo = Custo;
    }
}

Como não vai tratar as variáveis em separado não precisa criar outros getters e setters.

Não sei se ajuda mas olha como ta minha estrutura aqui

image

Nessa classe no caso eu já iria chama-la no menu e nos seus methodos eu to tentando ler os arquivos pra encaixa e dar o retorno correto.

Depois faz um arquivo de consulta com os métodos, onde irá buscar os dados das planilhas e alocar no construtor Chamados, Status e Lancamentos utilizando List, ArrayList e LinkedList conforme necessário.
Daí parte para o método de pergunta ao usuário e depois ao método de exibição dos dados.

Só para lhe dar uma estruturada no projeto.
image
Na prática a designação dos pacotes deve respeitar a convenção Java.
br.com.forna.entidade e etc, mas como está começando pode ser assim mesmo.
Na pasta entidade ficam todas as classes e métodos Chamados, Status e Lancamentos com o seus setters e getters em arquivos separados.
Na pasta modelo ficam as classes e métodos que manipulam os dados.
Na pasta visao fica a classe e métodos do menu em arquivo próprio.

1 curtida

Vou tentar aqui seguir esse padrão. Ainda não me acostumei com esses pacotes, é meio estranho pra mim. Essa entidade, modelo, recursos, são pacotes que eu vou usar pra chamar as classes e os metodos? ou são apenas pastas dentro do projeto?

Qual é a estrutura de cada arquivo csv?

Vai utilizar para chamar, mas a IDE lhe ajuda nisto.

Chamados.csv (546 Bytes)
Lançamentos.csv (1,1 KB)
Status.csv (1,1 KB)

Aqui os CSV, pois e, mas a ide me atrapalha um pouco com esse wizards

Se acostuma com os wizards com o tempo.
Repliquei seu código e as planilhas aqui.
Vai reestruturando o projeto e avisando o progresso.

image

E o menu ta ok só aguardando receber as funções. Esse package equivale-se a um include, tipo eu se quiser usar uma classe da do package modelo, eu importo ele para o arquivo que eu quero usar?

package visao;

import java.util.Scanner;

public class Menu {

public static void main(String[] args) {

  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:{
  			System.out.println("Opcao 1 selecionada");
  			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;
  		}
  		
  	}
  }

}
}

Olhando o código agora, o seu if no método LeChamadosCSV está dentro do while e deveria estar fora.
Outra coisa , na convenção Java a Classe escreve-se “LeChamadosCSV”, mas para métodos se utiliza “leChamadoCSV”, chamam isto de CammelCase.
https://www.oracle.com/technetwork/java/javase/documentation/codeconvtoc-136057.html

Isto mesmo. Fará imports quando necessário.
Fica mais fácil de enxergar o que está precisando para seu Menu.

No caso o método pra Ler o arquivo de Chamados.csv, no caso esta errado colocar o if dentro do while? entao como eu poderia controlar a exibição?

package modelo;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.util.Scanner;
import javax.swing.JOptionPane;

public class ConsultaChamados

{
public static void ConsultaChamados()
{

System.out.println("Por favor, informe o ID do chamado: ");
Scanner scan2 = new Scanner(System.in);

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

String chamadoCSV = "Chamados.csv";
String lancamentosCSV = "Lançamentos.csv";


leChamadosCSV(chamadoID, chamadoCSV);
MostraLancamentos(chamadoID, lancamentosCSV);

}

//Método que lê o arquivo Chamados.csv
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);
				
		if(linhas[0].equals(chamadoID))
		{
			ResultadoEncontrado = true;
			
			System.out.println
			(		
			"ID: " + linhas[0] + "\n" +
			"Descricao: " + linhas[1] + "\n" + 
			"Data de abertura: " + linhas[2] + "\n" + 
			"Custo: " + linhas[3] + "\n"
			);
			
		}
		
		if(!ResultadoEncontrado)
		{
			System.out.println("Chamado não encontrado !");
		}
	}
	
  } 	
	catch(Exception E)
  {
		System.out.println("ERRO: " + E.getMessage());
  }

}