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