Dúvida, redundância

Senhores quero produzir um código em java com o objetivo de ler CSV, fazer alterações, etc

Segue 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("------------------------------------------------");
	}
	
	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 < 0 || Opcao < 4) {
			
			try {
				
				System.out.println("Digite sua escolha: \n");
				Opcao = Integer.parseInt(leitor.nextLine());
				
			}catch(NumberFormatException e) {
				
				System.out.println("Opção inválida, selecione uma opção válida ! \n");
				
			}
		}
		
		return Opcao;
	}

	private void executaAcao(int Opcao) {
		
		switch(Opcao) {
			
			case 1:
				//Consulta();
				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");
		}
	}
}

A minha dúvida é a seguinte, eu tenho um while com as opções possíveis do menu, mas ele não ta caindo nele e dando a mensagem de erro do switch , será que o switch ja esta fazendo o trabalho de checar as opções do while ?

Eu achei o while, mas não o if…

No caso ele escorrega ja pra ultima opção do switch, sem cair no try com o while. Vou tentar retirar o default do switch e ver no que dá.

Mas em que parte do código está o bendito if?

Não tem if kk , eu revi e percebi que esta correto o código, o while quando eu digitava uma opção fora do range voltava para as opções, para que o usuario digitasse novamente. Agora estou criando as funções para chama-las nos cases.

Bom, testei seu código aqui e tudo funcionou ok, até digitar 4 quando ele deu a mensagem de agradecimento por usar a aplicação. Ao digitar número fora desse range, ele dá uma mensagem de erro desconhecido e volta para o menu. Ou seja, seu while(!sair) está funcionando como foi implementado já que só sai da aplicação quando o usuário digita 4.

Já seu switch está fazendo apenas o papel para o qual foi criado no caso. Qual problema você está tendo e com qual input?

Por hora, apenas alguns pequenos refactors para que você mantenha o padrão de codificação:

  • Renomeie a varíavel Opcao para opcao, nomes de variáveis deve ser formatadas começando com letras minúsculas. Pode parecer besteira, mas esses padrões tem um grande valor no longo prazo.
  • Sua validação “while(Opcao < 0 || Opcao < 4)” pode ser refeita para “while(Opcao < 4)” já que quem é menor que zero sempre é menor que 4.

Tem outras coisas para melhorar seu código, mas vamos um passo de cada vez e tentar primeiro solucionar o problema real para o qual o post foi criado já que eu não consegui reproduzí-lo. Fico no seu aguardo.

1 curtida

Bom, menos mal. Então siga as dicas e qualquer coisa avisa aí… :call_me_hand:

1 curtida

Opa voltei, criei duas classes uma para ler arquivos CSV e outra para Escrever neles e agora quero chamar estas pelo menu, acontece que tenho 3 arquivos csv na src do projeto, seria como meu banco de dados e cada classe le apenas um arquivo, como posso resolver isso e chamar essas funcoes de acordo com a opção que o usuario escolher ?

Lê o arquivo

import java.io.BufferedReader;
import java.io.FileReader;

public class LerCSV {

public static void main(String[] args) {
leArquivoCSV(arquivoCSV);
}

private static String arquivoCSV = “Chamados.csv”;

public static void leArquivoCSV(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) {
  	
  }

}

}

Escreve no Arquivo

import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.PrintWriter;

import javax.swing.JOptionPane;

public class EscreverCSV {

public static void main(String[] args) {

  String chamadoID = "101";
  String Descricao = "Teste2";
  String DataAbertura = "17/04/2019";
  String Custo = "101.00";
  String caminhoDoArquivo = "Chamados.csv";
  
  escreveNoArquivoCSV(chamadoID, Descricao, DataAbertura, Custo, caminhoDoArquivo);

}

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());
  }

}
}

Tua dúvida está bem confusa. Tem 3 arquivos CSV para serem lidos e exibidos, porém teu menu principal só tem (1) para Consultar / (2) para Salvar / (3) para Carregar.

Gasta um pouquinho mais de tempo antes de vir pro código e pensa bem em como vai ser a interação do usuário com sua solução, isso vai nos ajudar a entender o problema real e até você mesmo a entender melhor como desenhar a solução. Eu sei que você sabe o que quer fazer, mas está embaralhado ainda no seu cérebro. Ponha tudo no papel antes de transpor para código Java e você vai facilitar sua vida. Da maneira que está o código, vamos ficar um bom tempo com você fazendo perguntas e muito bate e volta até entender bem o que você quer.
:wink:

1 curtida

Eu quero que se o usuario digitar 1, seja exibida a mensagem “Por favor, informe o id do chamado:”. O usuário selecionando essa opção eu recupero o registro referente ao id informado.
Daí eu gostaria de exibir os dados do chamado:

ID
Descricao
Data de Abertura
Custo
---------- lançamento -----
Data de lançamento:
Status:
---------- fim ------

Caso o usuario digite 2 exibir a mensagem: “Por favor, informe o id do chamado:”
Dai eu recupero o registro referente ao id informado e exibo a seguinte mensagem “Por favor, informe o nome do arquivo a ser salvo” o usuario digita um nome para o arquivo e depois exibo a mensagem: “Arquivo salvo com sucesso”.

Caso o usuario digite 3: exibir a mensagem:" Informe o nome do arquivo a ser carregado (lido/interpretado) e exibir seus dados como na opção 1.

Caso o usuario digite 4: Sair da aplicação - Feito

Sei que é simples, eu quero este programinha para estudo para que eu possa aprender mais sobre java, estou começando agora com java e to com dificuldade em importar as classes, chamar as funções, etc. Espero que tenha ficado claro a minha duvida.

Você vai recuperar o arquivo csv que na sua pasta tem o nome com o id que o usuário vai informar pelo que entendi. Então depois de recuperar essas informações, você vai exibí-las ao usuário e deixar que ele edite as informações e depois você pretende salvar tudo isso de volta no CSV, é isso?

Perceba que se for isso são alguna passos que você vai ter que fazer e o primeiro deles é exatamente igual ao 1, já que você terá que fazer uma consulta e exibir essas informações ao usuário, outro ponto importantíssimo, você terá que colocar opções (se mantiver o esquema do Scanner) para cada um dos dados que o usuário vai poder editar no chamado, ou seja, while dentro de while, para então depois salvar tudo.

Ué, se é igual a opção 1 qual a diferença entre ambas?

Acho que no geral entendi o que você quer fazer, mas aqui no trampo estou sem tempo pra lhe ajudar mais, todavia o que eu indico é você parar de olhar pro seu código atual e repensá-lo um pouco. A ideia no geral está quase lá, mas os detalhes estão ainda quebrados. É trampo da facul? Tem até que prazo pra entregar?

Assim que chegar em casa vou poder sentar com calma e organizar as ideias melhor pra ti.

1 curtida

Você vai recuperar o arquivo csv que na sua pasta tem o nome com o id que o usuário vai informar pelo que entendi. Então depois de recuperar essas informações, você vai exibí-las ao usuário e deixar que ele edite as informações e depois você pretende salvar tudo isso de volta no CSV, é isso?

Isso, ele só vai salvar as informações e criar um novo registro, nada de editar por enquanto, os arquivos estão dentro da source do projeto, tipo um banco de dados.

Ate quinta a noite preciso entregar pra um colega da facul.

image

Tipo não to aplicando nenhum padrão de projeto, so to divindo em classes pra ficar mais legível e menos desorganizado e também para quando eu quiser editado ficar fácil a manutenção.


No caso o usuario ao adicionar um novo chamado ele só adiciona uma linha ao arquivo csv.

Tá, antes de tudo isso esse código que você botou aí em cima está gravando e lendo do CSV normalmente? Sem isso, o máximo que faremos é organizar seu código até o momento que ele chama o método para gravar no CSV ou recuperar dados do CSV.

Outra coisa, dentro do CSV você vai ter fazer filtro e gravar em um layout específico para cada um certo? Então nesse caso é bom que você faça uma classe para cada CSV seu, não precisa ter uma para ler e uma para escrever, apenas uma por CSV mesmo e dentro dela os métodos de leitura/escrita.

Sim os códigos leem o csv e gravam nele também.

Ccomo nada na vida se cria tudo se copia, pensei em fazer várias cópias da classe para ler e escrever determinado arquivo, entao precisaria de 3 classes que le e escreve em determinado arquivo. Mas será que não é muito verboso ? tipo má prática?

Dá pra deixar menos verboso, mas como cada CSV tem um layout, ainda terias que criar um outro nível de abstração onde teu método de leitura e escrita teria que conhecer exatamente o layout do teu CSV. Tem uma forma de abstrair apenas o Layout usando interface e fazendo teu Ler Escreve chamar um único método, mas ainda terás que ter um .java pra cada um dos CSV. Por isso lhe indico a fazer um pra cada CSV e no final vamos fazer um refactor com uma interface CSVFile (por exemplo, que no final sua GUI vai conhecer apenas a interface e com base na entrada do usuário retornaremos a classe concreta espeífica). Te aconselho a nesse momento não se preocupar muito com isso, tenta primeiro resolver teu problema mesmo que enchendo o código de ifs e elses.

1 curtida

Farei isto e vou transformar essas classes em 3 classes de leitura e escrita para cada arquivo, depois vou encaixa-la no switch do menu.

Olha eu tenho alguns passos a seguir , parece que ja to meio caminho andado, talvez nao precise de 3 classes mas somente uma e trabalhar com os dados dentro dela, colocar a exibição em métodos e chama-los quando conveniente.


Fiz a classe para ler o chamado

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) {
  	
  }

}

E no meu menu eu chamo ela no switch

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;

}

private void executaAcao(int opcao) {

  switch(opcao) {
  	
  	case 1:
  		LerEscreverChamado ler = new LerEscreverChamado();
  		ler.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");
  }

}
}

A questão é que ele não ta me retornando nada no console, e não me da nenhum erro.