faber222 / Quick-Read-CSV-File

um programa para consultas em arquivo CSV
MIT License
2 stars 0 forks source link

Diário - IgorSVieira #1

Open IgorSVieira opened 2 years ago

IgorSVieira commented 2 years ago

Como ponto de partida, escrevi um resumo do que seria feito no código. Os tópicos foram organizados da seguinte forma: 1 - Ler o arquivo e indexa-lo conforme a coluna escolhida pelo usuário. 2 - Apresentar os prompts para o usuário entrar com os valores inicial e final. 3 - Obter os números das linhas que estão atreladas a um valor que está entre o inicial e final. 4 - Ler o arquivo e obter o conteúdo das linhas. 5 - Mostrar os conteúdos. Só pode ser usada a estrutura árvore! Então, a ideia inicial é criar uma árvore de structs que guarda o número da linha e o valor da coluna que foi indexada. No momento, o ponto menos esclarecido é de como será feito para indexar por uma coluna que não seja a primeira. Pensei um pouco sobre isso e acho que se eu criar um contador que funcione de tal forma é possível obter sucesso: Exemplo: O usuário quer indexar pela terceira coluna.

Para buscar os valores, a preocupação é fazer uma comparação entre valores que estão na struct. Vou me basear no exercício feito no dia 01/06, "Consulta de dados com árvore e tipo de dados definido pelo programador". Para obter o valor da linha, deve ser usada uma das funções, tellg ou seekg, que foram indicadas em aula.

Todas essas informações compõe um ótimo ponto inicial do projeto.

IgorSVieira commented 2 years ago

Como começo do desenvolvimento, implantei o primeiro tópico (Ler o arquivo e indexa-lo conforme a coluna escolhida pelo usuário). O programa lê o arquivo cujo nome é passado como primeiro argumento de linha de comando e procura em qual posição está o nome da coluna que foi passado pelo segundo argumento de linha de comando. A posição é verificada e guardada por uma variável usada como contador. Como a primeira linha do arquivo tem sempre os nomes das colunas, a cada palavra lida, o contador é incrementado, e se a palavra lida corresponde à coluna desejada, o contador não é mais incrementado e essa variável não é mais utilizada.

Se temos as colunas "CPF, NOME, IDADE" e é desejada a coluna idade, o contador tem o seu valor final igual a 3.

Na segunda etapa, que é a de indexação, o programa lê as informações, que estão separadas por vírgulas, e descarta enquanto o contador de leitura não for igual ao contador anterior, que estabeleceu a posição. Então, nesse caso, só entram na árvore a terceira informação de cada linha.

Foi preciso definir operadores, como "==" e "<" para a comparação na árvore acontecer. Me preocupei também em colocar mensagens de erro como "ARQUIVO INVALIDO OU INEXISTENTE" para quando o arquivo não puder ser aberto e "A COLUNA NÃO EXISTE" para quando a palavra passada por segundo argumento de linha de comando não corresponder à nenhuma coluna.

Ao final da implementação do código para obter somente a informação da coluna desejada, o desenvolvimento foi interrompido por conta de um erro com a biblioteca prglib no meu computador. A biblioteca é reconhecida mas o código não é compilado. Tive certeza de que o erro era da biblioteca quando tentei compilar um exercício que funcionou perfeitamente no moodle.

A mensagem de erro é a seguinte: /usr/bin/ld: /tmp/cc9BIJMX.o: na função "prglib::nodo_arvore::adiciona(index const&)": main.cpp:(.text._ZN6prglib11nodoarvoreI5indexE8adicionaERKS1[_ZN6prglib11nodoarvoreI5indexE8adicionaERKS1]+0x23): referência não definida para "prglib::BasicTree::adiciona(void)" /usr/bin/ld: /tmp/cc9BIJMX.o: na função "prglib::nodo_arvore::nodo_arvore(index const&)": main.cpp:(.text._ZN6prglib11nodoarvoreI5indexEC2ERKS1[_ZN6prglib11nodoarvoreI5indexEC5ERKS1]+0x28): referência não definida para "prglib::BasicTree::BasicTree(void)" /usr/bin/ld: main.cpp:(.text._ZN6prglib11nodoarvoreI5indexEC2ERKS1[_ZN6prglib11nodoarvoreI5indexEC5ERKS1]+0x62): referência não definida para "prglib::BasicTree::~BasicTree()" /usr/bin/ld: /tmp/cc9BIJMX.o:(.data.rel.ro._ZTIN6prglib11nodo_arvoreI5indexEE[_ZTIN6prglib11nodo_arvoreI5indexEE]+0x18): referência não definida para "typeinfo for prglib::BasicTree" /usr/bin/ld: /tmp/cc9BIJMX.o: na função "prglib::nodo_arvore::~nodo_arvore()": main.cpp:(.text._ZN6prglib11nodo_arvoreI5indexED2Ev[_ZN6prglib11nodo_arvoreI5indexED5Ev]+0x36): referência não definida para "prglib::BasicTree::~BasicTree()" collect2: error: ld returned 1 exit status

Corrigindo isso, voltarei ao desenvolvimento.

IgorSVieira commented 2 years ago

O tempo da aula foi utilizado para realizar uma pesquisa mais aprofundada sobre como ler uma determinada linha do arquivo, que foi complementada pelo professor com uma explicação sobre como funciona esse processo. Iniciei o desenvolvimento da interface que recebe os valores inicias e finais para a pesquisa na coluna passada como argumento de linha de comando e da função que realiza a busca na árvore. A ideia é encontrar todas as posições que estão entre os parâmetros passados e colocá-los em uma lista. A função que lê somente as linhas específicas vai se basear nela.

IgorSVieira commented 2 years ago

Com a ajuda do @faber222 , consegui resolver o problema de compilação em meu computador.

Na parte final do desenvolvimento, optei por dedicar o meu tempo à função que procura os dados em um intervalo, conforme o valor inicial e final passados pelo usuário e também à função que retorna as linhas que devem ser mostradas.

Sobre a função que procura dados em um intervalo, usei "obtemIntervalo", seguindo um código que tinha sido desenvolvido em aula. Nessa parte, fiquei durante muito tempo tentando fazer funcionar. Primeiro, percebi que o código não procurava entre os valores passados pelo usuário, mas sim pelo número da posição da linha, informação que estava guardada nas structs armazenadas na árvore. O desenvolvimento dessa parte foi custoso pois demorei muito tempo para perceber que os operadores "==" e "<" não poderiam ser redefinidos, mas sim definidos de outra forma. Foi a partir desse momento que a árvore passou a ser organizada de acordo com o dado da coluna e não de acordo com o número da linha. Depois de muito tempo, essa etapa foi finalizada!!!!!!!

Passado esse longo período, iniciei a implementação da função que recebe uma lista com as structs que devem ter o número de linha considerados para mostrar ao usuário. Então, basicamente, o funcionamento ocorre da seguinte forma:

Ao final desse processo, basta printar cada item da lista na tela. Quando eu terminei essa implementação, enviei o código para o @faber222 e ficamos um tempo tentando entender o motivo de não termos uma saída. Até que eu percebi que passei como nome de arquivo o argumento 2 da linha de comando, enquanto eu deveria ter passado o argumento 1. Os detalhes e as solicitações que estavam na proposta do projeto 2 foram tratadas pelo @faber222 e tudo está descrito em seu diário de bordo.

Concluímos mais uma etapa!

IgorSVieira commented 2 years ago

Fiz uma série de testes com o código para tentar encontrar possíveis erros e o resultado foi muito positivo, o programa funciona perfeitamente conforme as situações criadas (os testes estão descritos no relatório). Em chamada com o @faber222 , adicionamos uma mensagem para quando nenhum resultado é encontrado, situando o usuário de que o programa executou a busca entre os parâmetros inicias e finais e nada foi retornado. Além disso, colocamos em funcionamento a busca com somente um parâmetro, quando o usuário tecla enter no valor 2. Para isso, criamos uma variável que possui o último maior valor de indexação, que é usado como valor 2 para realizar a busca. Após essa etapa e tudo o que está descrito nesse diário, finalizamos o código.