Dúvida, redundância

21 respostas Resolvido
javacsv
F

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 ?

21 Respostas

darlan_machado

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

F

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á.

darlan_machado

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

F

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.

adriano_si

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.

adriano_si

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

F

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

}
}

adriano_si

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:

F

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

F

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.

adriano_si

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.

F

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.

F

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.

adriano_si

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.

F

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?

adriano_si
Solucao aceita

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.

F

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.

F

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.


F

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.

adriano_si

Eu te confesso que sou zerado em leitura de CSV em Java, mas creio que não deve ser de outro mundo. Sua solução, deve ter algum detalhe na hora de executar a linha

while(( linha = leitorCSV.readLine() ) != null) {

Eu aconselho que você ponha um debug na sua classe e na hora de executar valide o que pode estar acontecendo. Você sabe debugar a aplicação?

F

Não, com java são meus primeiros passos. Estou refazendo tudo denovo, percebi que a aplicação não executa o case1 do switch somente o case4 que é para sair da aplicação, então estou refazendo o menu. Por alguma razão ele não cai no case 1 ai logo ele não chama nenhuma função.

Criado 17 de abril de 2019
Ultima resposta 18 de abr. de 2019
Respostas 21
Participantes 3