Ir ao conteúdo
  • Cadastre-se

C Passar dados de um arquivo csv para uma struct


ArthurRodr

Posts recomendados

E aí galera beleza?

 

Recebi um exercício a pouco tempo que pede para organizar a primeira coluna de um arquivo .csv usando o Selection Sort, mas para fazer essa organização eu preciso atribuir os dados das colunas à struct na hora de imprimi-las, porém o problema está na hora da atribuição, quando eu tento fazê-la tenho a seguinte saída:         

24    24    [Error] invalid conversion from 'char*' to 'int' [-fpermissive]

 

O que devo fazer para resolver esse problema?

Meu código é este abaixo:

 

#include <stdio.h>
#include <string.h>

 

typedef struct Colunas{
    int ispb;
    char nome_reduzido[50];
    int numero_codigo[3];
    char partic_compe[3];
    char acesso_princ[4];
    char nome_exten[50];
    int inicio_op[8];
}colunas; 

 

colunas dados[250];//Número de linhas do arquivo

 

void process_field(int coluna,  char *value, int i) {
    
    FILE *arq;
    
    for(i=0; i<249; i++){
        
        if (coluna == 0) {
            dados.ispb = value;    
            printf("ISPB:\t");    
        }
        if (coluna == 1) {
            printf("Nome Reduzido:\t");
        }
        if (coluna == 2) {
            printf("Numero Codigo:\t");
        }
        if (coluna == 3) {
            printf("Participa da compe:\t");
        }
        if (coluna == 4) {
            printf("Acesso principal:\t");
        }
        if (coluna == 5) {
            printf("Nome extenso:\t");
        }
        if (coluna == 6) {
            printf("Inicio da operacao:\t");
        }
        printf("%s\n", value);
    }
    fclose(arq);
}

void selectionSort(int *vet, int tam){
    int menor, aux; 

       for(int i = 0; i<tam-1; i++){
        menor=i;   
        for(int j = i+1 ; j<tam; j++){           
            if(vet[menor]>vet[j]){
                menor=j;
            }
            if(i!=menor){
                      aux = vet;
                vet=vet[menor];
                vet[menor]=aux;
            }
        }
    }  
}  //Ainda não coloquei o Selection Sort

 

int main() {
    char buffer[1024];
    char chave[1024];
    
    int linha = 0;
    int coluna = 0;
    int aspas = 0;
    int posicao_chave = 0;
   
    FILE *arq;
    arq = fopen("ParticipantesSTRport.csv", "r");

    while (fgets(buffer, 1024, arq)) {
        linha++;
       
        if (linha == 1) {
            continue;
        }
     
        coluna = 0;
        int i = 0;
        
        do {
            chave[posicao_chave++] = buffer;

            if (!aspas && (buffer == ',' || buffer == '\n')) {
                chave[posicao_chave - 1] = 0;
                posicao_chave = 0;
                process_field(coluna++, chave, i);
            }

            if (buffer == '"' && buffer[i + 1] != '"') {
                posicao_chave--;
                aspas = !aspas;
            }

            if (buffer == '"' && buffer[i + 1] == '"')
                i++;

        } while (buffer[++i]);

        printf("\n");
    }

    fclose(arq);

    return 0;
}

 

O código e o arquivo csv estão em anexo.

 

Desktop.rar

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Sério que postou um link para um arquivo num formato que nem é nativo em windows, de modo que eu preciso de um programa para extrair rar (se fosse zip não seria preciso). Depois vou sair do forum e rodar esse programa e extrair o arquivo, depois vou abrir o arquivo...

 

Não seria mais simples postar as 3 ou 4 primeiras linhas do arquivo?
 

Use esse botão < > aí em cima para postar seu código, porque isso também facilita se alguém for importar seu código pra testar.

 

De volta ao programa

 

Seu problema nada tem a ver com o sort() ou o enunciado em si, então use OUTRO programa apenas para ler o csv e colocar na struct. É muito mais produtivo. 

 

  • Não use NUNCA variáveis globais. É um inferno. Trata-se de pedir problemas. Os autores avisam, os livros explicam, as escolas ensinam, as empresas proíbem. Não é porque eu estou falando
  • typedef struct Colunas {
        int ispb;
        char nome_reduzido[50];
        int numero_codigo[3];
        char partic_compe[3];
        char acesso_princ[4];
        char nome_exten[50];
        int inicio_op[8];
    }   colunas;

    Não declare nada assim: também é problema. 
    Não declare variáveis ao definir uma estrutura. Nunca. Em geral nem se usa o mesmo arquivo. A lógica é simples: num arquivo você declara como são as coisas, as estruturas e tipos do programa. Em outro você declara as variáveis.
    Os profissionais fazem assim apenas porque é muito mais fácil. 
     

  • Só aqui num programa simples para iniciantes já temos problemas por causa disso: a declaração de colunas está escondida junto com a declaração da struct Colunas. Aí se eu for escrever um programinha pra testar a parada de gravar o csv na struct e eu só declarar esse arquivo como "tipos.h" para não ter que repetir e copiar e colar tudo de novo ele vai arrastar essa declaração junto, que não tem nada a ver. E essa variável pode acabar também global. Em outros programas!

  •             dados.ispb = value;

    Você escreveu isso em seu programa e está errado. Não existe dados.ispb
    ispb é um campo dentro da struct colunas, um int.

    E dados é 

    colunas dados[250];    //Número de linhas do arquivo
    

    E claro que não combina. Existem 250 dados e cada um deles é do tipo Colunas.

 

 Como ler um arquivo csv

 

Faça o simples e antes escreva um programa pra ler e mostrar isso pra ficar seguro.. Nem precisa da struct num primeiro momento.

fscanf() foi feita para ler esse tipo de dados. É muito simples. Em geral a primeira linha do vetor tem o nome dos campos e se não for usar no programa não se esqueça de desprezar a primeira linha. Isso existe porque em geral as planilhas e os bancos de dados precisam dar nomes aos campos...

Importe seu csv no Google Planilhas ou no Excel por exemplo ANTES para saber se está tudo certo e não correr riscos...

 

Avise se não entendeu algo

 

 

  • Curtir 2
Link para o comentário
Compartilhar em outros sites

Em 05/07/2020 às 14:51, arfneto disse:

Sério que postou um link para um arquivo num formato que nem é nativo em windows, de modo que eu preciso de um programa para extrair rar (se fosse zip não seria preciso). Depois vou sair do forum e rodar esse programa e extrair o arquivo, depois vou abrir o arquivo...

 

Não seria mais simples postar as 3 ou 4 primeiras linhas do arquivo?
 

Use esse botão < > aí em cima para postar seu código, porque isso também facilita se alguém for importar seu código pra testar.

 

De volta ao programa

 

Seu problema nada tem a ver com o sort() ou o enunciado em si, então use OUTRO programa apenas para ler o csv e colocar na struct. É muito mais produtivo. 

 

  • Não use NUNCA variáveis globais. É um inferno. Trata-se de pedir problemas. Os autores avisam, os livros explicam, as escolas ensinam, as empresas proíbem. Não é porque eu estou falando
  • 
    typedef struct Colunas {
        int ispb;
        char nome_reduzido[50];
        int numero_codigo[3];
        char partic_compe[3];
        char acesso_princ[4];
        char nome_exten[50];
        int inicio_op[8];
    }   colunas;

    Não declare nada assim: também é problema. 
    Não declare variáveis ao definir uma estrutura. Nunca. Em geral nem se usa o mesmo arquivo. A lógica é simples: num arquivo você declara como são as coisas, as estruturas e tipos do programa. Em outro você declara as variáveis.
    Os profissionais fazem assim apenas porque é muito mais fácil. 
     

  • Só aqui num programa simples para iniciantes já temos problemas por causa disso: a declaração de colunas está escondida junto com a declaração da struct Colunas. Aí se eu for escrever um programinha pra testar a parada de gravar o csv na struct e eu só declarar esse arquivo como "tipos.h" para não ter que repetir e copiar e colar tudo de novo ele vai arrastar essa declaração junto, que não tem nada a ver. E essa variável pode acabar também global. Em outros programas!

  • 
                dados.ispb = value;

    Você escreveu isso em seu programa e está errado. Não existe dados.ispb
    ispb é um campo dentro da struct colunas, um int.

    E dados é 

    
    colunas dados[250];    //Número de linhas do arquivo
    

    E claro que não combina. Existem 250 dados e cada um deles é do tipo Colunas.

 

 Como ler um arquivo csv

 

Faça o simples e antes escreva um programa pra ler e mostrar isso pra ficar seguro.. Nem precisa da struct num primeiro momento.

fscanf() foi feita para ler esse tipo de dados. É muito simples. Em geral a primeira linha do vetor tem o nome dos campos e se não for usar no programa não se esqueça de desprezar a primeira linha. Isso existe porque em geral as planilhas e os bancos de dados precisam dar nomes aos campos...

Importe seu csv no Google Planilhas ou no Excel por exemplo ANTES para saber se está tudo certo e não correr riscos...

 

Avise se não entendeu algo

 

 

Boa noite, gostaria de agradecer a resposta

Então... entendi que basicamente está tudo errado na hora de passar esses dados do arquivo csv para a struct,

então fiz como solicitado, removi a variável global da struct e retornei alguns passos até quando o código fazia apenas a leitura, impressão dos dados a partir da segunda linha e a organização do layout, então gostaria de saber como prosseguir com as atribuições à struct para que eu possa fazer o Selection Sort com os dados da primeira coluna.

Código

#include <stdio.h>
#include <string.h>

struct colunas {
	int ispb;
	char nome_reduzido[50];
	int numero_codigo[3];
	char partic_compe[3];
	char acesso_princ[4];
	char nome_exten[50];
	int inicio_op[8];
}; 

void process_field(int coluna,  char *value) {

		
		if (coluna == 0) {
			printf("ISPB:\t");	
		}
	    if (coluna == 1) {
			printf("Nome Reduzido:\t");
	    }
	    if (coluna == 2) {
	        printf("Numero Codigo:\t");
	    }
	    if (coluna == 3) {
	        printf("Participa da compe:\t");
	    }
	    if (coluna == 4) {
	        printf("Acesso principal:\t");
	    }
	    if (coluna == 5) {
	        printf("Nome extenso:\t");
	    }
	    if (coluna == 6) {
	        printf("Inicio da operacao:\t");
	    }
	    printf("%s\n", value);
}

void selectionSort(int *vet, int tam){
	int menor, aux; 

   	for(int i = 0; i<tam-1; i++){
    	menor=i;   
		for(int j = i+1 ; j<tam; j++){           
			if(vet[menor]>vet[j]){
		        menor=j;
		    }
		    if(i!=menor){
	   		   	aux = vet[i];
				vet[i]=vet[menor];
				vet[menor]=aux;
			}
		}
	}  
}//Ainda não coloquei o Selection Sort

int main() {
	char buffer[1024];
    char chave[1024];
    
    int linha = 0;
    int coluna = 0;
    int aspas = 0;
    int posicao_chave = 0;
   
    FILE *arq;
    arq = fopen("ParticipantesSTRport.csv", "r");

    while (fgets(buffer, 1024, arq)) {
        linha++;
	   
	    if (linha == 1) {
            continue;
        }
	 
	    coluna = 0;
	    int i = 0;
	    
        do {
            chave[posicao_chave++] = buffer[i];

            if (!aspas && (buffer[i] == ',' || buffer[i] == '\n')) {
                chave[posicao_chave - 1] = 0;
                posicao_chave = 0;
                process_field(coluna++, chave);
            }

            if (buffer[i] == '"' && buffer[i + 1] != '"') {
                posicao_chave--;
                aspas = !aspas;
            }

            if (buffer[i] == '"' && buffer[i + 1] == '"')
                i++;

        } while (buffer[++i]);

        printf("\n");
    }

    fclose(arq);

    return 0;
}

 

O código modificado e o .csv estão em anexo.

Desktop.zip

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

6 minutos atrás, ArthurRodr disse:

Então... entendi que basicamente está tudo errado na hora de passar esses dados do arquivo csv para a struct,

então fiz como solicitado, removi a variável global da struct e retornei alguns passos até quando o código fazia apenas a leitura, impressão dos dados a partir da segunda linha e a organização do layout, então gostaria de saber como prosseguir com as atribuições à struct para que eu possa fazer o Selection Sort com os dados da primeira coluna

 

Tenho a impressão que você quer fazer algo um pouco diferente do que escreveu: o que fazer é classificar o arquivo todo pelo valor da primeira coluna, certo?

 

Essa é a mesma discussão desse tópico aqui, não é?

 

 

Veja o que escrevi lá sobre isso há pouco, pra eu não ter que escrever de novo. Depois pode responder aqui pra ver se podemos fazer algo

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

13 horas atrás, arfneto disse:

 

Tenho a impressão que você quer fazer algo um pouco diferente do que escreveu: o que fazer é classificar o arquivo todo pelo valor da primeira coluna, certo?

 

Essa é a mesma discussão desse tópico aqui, não é?

 

 

Veja o que escrevi lá sobre isso há pouco, pra eu não ter que escrever de novo. Depois pode responder aqui pra ver se podemos fazer algo

Bom dia é isso mesmo 

O que acontece é que ambos recebemos um exercício de algo que não foi explicado para nós em momento algum, com o código que já fiz seria a mesma ideia desse outro tópico?

  • Curtir 2
Link para o comentário
Compartilhar em outros sites

Acho que sim.

 

Mas não entendo a ideia do seu código.

 

Qual a ideia de process_field()?

 

Onde vai guardar os dados afinal? Não vejo lugar no programa.

    char buffer[1024];
    char chave[1024];
    
    int linha = 0;
    int coluna = 0;
    int aspas = 0;
    int posicao_chave = 0;

Você em buffer[] mas chave[] também só tem lugar para um registro

 

Entendeu o que eu expliquei sobre o sort?

 

Leu o que escrevi no outro tópico?

 

Qual a sua dúvida nesse exercício? O que não foi explicado de que fala? o selection sort ou o formato csv? Já escreveu outros programas em C? Em alguma outra linguagem?

 

 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

3 minutos atrás, arfneto disse:

Acho que sim.

 

Mas não entendo a ideia do seu código.

 

Qual a ideia de process_field()?

 

Onde vai guardar os dados afinal? Não vejo lugar no programa.


    char buffer[1024];
    char chave[1024];
    
    int linha = 0;
    int coluna = 0;
    int aspas = 0;
    int posicao_chave = 0;

Você em buffer[] mas chave[] também só tem lugar para um registro

 

Entendeu o que eu expliquei sobre o sort?

 

Leu o que escrevi no outro tópico?

 

Qual a sua dúvida nesse exercício? O que não foi explicado de que fala? o selection sort ou o formato csv? Já escreveu outros programas em C? Em alguma outra linguagem?

 

 

Minha dúvida nesse exercício é que não sei como vou fazer esse código, meu conhecimento em c é muito baixo os únicos programas que escrevi foram de leitura e impressão de dados (dentro do próprio programa), aprendemos o que era selection sort e os outros métodos de ordenação (só o conceito), mas não aprendemos a fazer isso em um arquivo csv.  

  • Curtir 2
Link para o comentário
Compartilhar em outros sites

10 minutos atrás, ArthurRodr disse:

Minha dúvida nesse exercício é que não sei como vou fazer esse código, meu conhecimento em c é muito baixo os únicos programas que escrevi foram de leitura e impressão de dados (dentro do próprio programa), aprendemos o que era selection sort e os outros métodos de ordenação (só o conceito), mas não aprendemos a fazer isso em um arquivo csv

 

Entendo

 

Você leu o que expliquei nesse e no outro tópico?

 

11 minutos atrás, ArthurRodr disse:

Você em buffer[] mas chave[] também só tem lugar para um registro

 

Entendeu o que perguntei sobre isso?

 

12 minutos atrás, ArthurRodr disse:

Entendeu o que eu expliquei sobre o sort?

 

Leu o que escrevi no outro tópico?

 

O sort e o arquivo csv

 

O sort nada tem a ver com o arquivo csv. Na verdade, como o campo que quer usar é o primeiro, um número, é o mais simples possível: classificar por um int.

 

E o nome dos campos e tal de nada serve aqui. Só trata mesmo a posição deles e o primeiro campo

 

Você entendeu o que eu expliquei sobre o insertion sort? No outro tópico

 

 

 

eu postei uma função que faz isso (insertion sort) enquanto lê, e assim quando termina de ler já está classificado

Link para o comentário
Compartilhar em outros sites

23 minutos atrás, arfneto disse:

 

Entendo

 

Você leu o que expliquei nesse e no outro tópico?

 

 

Entendeu o que perguntei sobre isso?

 

 

O sort e o arquivo csv

 

O sort nada tem a ver com o arquivo csv. Na verdade, como o campo que quer usar é o primeiro, um número, é o mais simples possível: classificar por um int.

 

E o nome dos campos e tal de nada serve aqui. Só trata mesmo a posição deles e o primeiro campo

 

Você entendeu o que eu expliquei sobre o insertion sort? No outro tópico

 

 

 

eu postei uma função que faz isso (insertion sort) enquanto lê, e assim quando termina de ler já está classificado

Eu entendi o que foi postado nos outros tópicos mas não sei executar, devo fazer a ordenação enquanto leio o arquivo para ele ser impresso já ordenado, mas como vou fazer? o outro código faz a ordenação usando o insertion sort na hora de imprimir, no meu caso o código devo fazer a ordenação usando o selection sort e o número de colunas e linhas do meu arquivo é diferente.  

  • Curtir 1
  • Obrigado 1
Link para o comentário
Compartilhar em outros sites

13 minutos atrás, ArthurRodr disse:

Eu entendi o que foi postado nos outros tópicos mas não sei executar, devo fazer a ordenação enquanto leio o arquivo para ele ser impresso já ordenado, mas como vou fazer? o outro código faz a ordenação usando o insertion sort na hora de imprimir, no meu caso o código devo fazer a ordenação usando o selection sort e o número de colunas e linhas do meu arquivo é diferente.  

 

Não entendi o que quer dizer.

 

Para seu exercício basta rolar na tela as linhas, mas classificados pelo primeiro campo através do insertion sort, não é?

 

16 minutos atrás, ArthurRodr disse:

o número de colunas e linhas do meu arquivo é diferente.  

 

Isso não faz diferença. Os algoritmos de sort classificam qualquer coisa. O formato csv pode conter qualquer coisa. 

Você escreveu aquele código que postou?

 

 

 

 

Link para o comentário
Compartilhar em outros sites

2 minutos atrás, arfneto disse:

 

Não entendi o que quer dizer.

 

Para seu exercício basta rolar na tela as linhas, mas classificados pelo primeiro campo através do insertion sort, não é?

 

 

Isso não faz diferença. Os algoritmos de sort classificam qualquer coisa. O formato csv pode conter qualquer coisa. 

Você escreveu aquele código que postou?

 

 

 

 

o meu exercício é através do Selection Sort, não, foi meu professor que me passou e disse que a partir daquele ponto eu deveria fazer a atribuição pelo process_field.

Link para o comentário
Compartilhar em outros sites

3 minutos atrás, ArthurRodr disse:

o meu exercício é através do Selection Sort, não, foi meu professor que me passou e disse que a partir daquele ponto eu deveria fazer a atribuição pelo process_field

 

Não entendo o que quer dizer. Talvez você tenha misturado tudo em uma única sentença.

 

A partir de que ponto? process_field() só mostra uma mensagem. Não é nada ativo.

Você tem um enunciado mais preciso? O que era pra ser aquilo?

 

Se entendeu o que eu expliquei e entendeu o algoritmo na aula sabe que o insertion sort é provavelmente o mais simples desses algoritmos exceto talvez o radix sort.

E entendeu que o insertion sort, como o nome já diz, vai inserindo os caras na ordem um a um até acabar.
E assim sendo se está lendo de um arquivo não é nada inteligente gravar tudo na memória pra depois ir lá e colocar na ordem. Expliquei isso também, e dei um exemplo, o clássico exemplo do baralho:
Se alguém te dá as cartas pra por em ordem, uma a uma, alguém nesse mundo ia esperar receber todas  e colocar uma a uma na ordem de entrada na mesa para depois voltar lá na mesa e pegar a pilha e ir colocando em ordem inserindo a partir da primeira? Não, provavelmente já iria colocando na ordem.
 

Essencialmente isso é Insertion Sort afinal. Veja essa animação meiga

 

E eu te mandei o código ;)

 

Você precisa ler do arquivo e colocar na tal struct como falou. Só que seu programa não tem nenhuma que sirva. É bobagem usar uma struct com os campos e colocar os valores lá. Não vai usar pra nada.

 

O programa que tem, esse sem titulo1.cpp é um programa em C com extensão cpp e não é nada bom se foi feito por um professor.

 

Um arquivo csv é uma tabela perfeita, com MxN linhas e colunas. Seu arquivo tem 7 campos e 250 linhas. Eis as 4 primeiras

ISPB,Nome_Reduzido,Numero_Codigo,Participa_da_Compe,Acesso_Principal,Nome_Extenso,Início_da_Operação
00000000,BCO DO BRASIL S.A.,001,Sim,RSFN,Banco do Brasil S.A.                                                            ,22/04/2002
00000208,BRB - BCO DE BRASILIA S.A.,070,Sim,RSFN,BRB - BANCO DE BRASILIA S.A.                                                    ,22/04/2002
00038121,Selic                              ,n/a,Não,RSFN,Banco Central do Brasil - Selic                                                 ,22/04/2002

 

Exercitando a imaginação vamos supor que process_fields() fosse para escolher o campo de classificação, mas você e seu colega disseram que é fixo o primeiro campo. Então de nada serve essa rotina.

 

Então uma struct que resolveria o seu problema --- e o de seu colega --- poderia ser algo ingênuo como 

typedef struct
{
    int    ispb; // o campo para classificar
    char   L[200]; // e a linha

}   Registro;


typedef struct
{
     int N;
     Registro R[300]; 

}    CSV;

CSV		tabela;

Sobre os dados

  • Registro tem 2 campos: um com a "chave" de classificação, o tal primeiro campo. e outro com a linha como estava
  • CSV tem dois campos: um N que vai contar quantos caras leu, e uma tabela de 300 registros, suficiente para seu teste

Então sua variável tabela nesse exemplo é uma lista de até 300 linhas do arquivo. Claro que na prática não se faria assim, com tudo fixo, mas é só um exercício de introdução

 

Você lê as linhas, pode até mudar essa process_fields() que de nada serve para tratar cada linha:

  • pega o primeiro campo. Trivial: basta pegar o que veio na leitura e ir até a primeira vírgula, lá vai estar o número de oito dígitos que vai ser o critério de classificação.
  • copia a linha toda pro campo linha, sem olhar pra ela porque de nada serve

    Use o código que mostrei para inserir esse Registro na tabela, contando o valor em N. 

E pronto. leia as linhas direto pra tabela usando a rotina que mostrei e ao final pode usar um simples loop e mostrar todas as linhas porque estarão já na ordem, classificadas pelo insertion sort.

Link para o comentário
Compartilhar em outros sites

24 minutos atrás, arfneto disse:

 

Não entendo o que quer dizer. Talvez você tenha misturado tudo em uma única sentença.

 

A partir de que ponto? process_field() só mostra uma mensagem. Não é nada ativo.

Você tem um enunciado mais preciso? O que era pra ser aquilo?

 

Se entendeu o que eu expliquei e entendeu o algoritmo na aula sabe que o insertion sort é provavelmente o mais simples desses algoritmos exceto talvez o radix sort.

E entendeu que o insertion sort, como o nome já diz, vai inserindo os caras na ordem um a um até acabar.
E assim sendo se está lendo de um arquivo não é nada inteligente gravar tudo na memória pra depois ir lá e colocar na ordem. Expliquei isso também, e dei um exemplo, o clássico exemplo do baralho:
Se alguém te dá as cartas pra por em ordem, uma a uma, alguém nesse mundo ia esperar receber todas  e colocar uma a uma na ordem de entrada na mesa para depois voltar lá na mesa e pegar a pilha e ir colocando em ordem inserindo a partir da primeira? Não, provavelmente já iria colocando na ordem.
 

Essencialmente isso é Insertion Sort afinal. Veja essa animação meiga

 

E eu te mandei o código ;)

 

Você precisa ler do arquivo e colocar na tal struct como falou. Só que seu programa não tem nenhuma que sirva. É bobagem usar uma struct com os campos e colocar os valores lá. Não vai usar pra nada.

 

O programa que tem, esse sem titulo1.cpp é um programa em C com extensão cpp e não é nada bom se foi feito por um professor.

 

Um arquivo csv é uma tabela perfeita, com MxN linhas e colunas. Seu arquivo tem 7 campos e 250 linhas. Eis as 4 primeiras


ISPB,Nome_Reduzido,Numero_Codigo,Participa_da_Compe,Acesso_Principal,Nome_Extenso,Início_da_Operação
00000000,BCO DO BRASIL S.A.,001,Sim,RSFN,Banco do Brasil S.A.                                                            ,22/04/2002
00000208,BRB - BCO DE BRASILIA S.A.,070,Sim,RSFN,BRB - BANCO DE BRASILIA S.A.                                                    ,22/04/2002
00038121,Selic                              ,n/a,Não,RSFN,Banco Central do Brasil - Selic                                                 ,22/04/2002

 

Exercitando a imaginação vamos supor que process_fields() fosse para escolher o campo de classificação, mas você e seu colega disseram que é fixo o primeiro campo. Então de nada serve essa rotina.

 

Então uma struct que resolveria o seu problema --- e o de seu colega --- poderia ser algo ingênuo como 


typedef struct
{
    int    ispb; // o campo para classificar
    char   L[200]; // e a linha

}   Registro;


typedef struct
{
     int N;
     Registro R[300]; 

}    CSV;

CSV		tabela;

Sobre os dados

  • Registro tem 2 campos: um com a "chave" de classificação, o tal primeiro campo. e outro com a linha como estava
  • CSV tem dois campos: um N que vai contar quantos caras leu, e uma tabela de 300 registros, suficiente para seu teste

Então sua variável tabela nesse exemplo é uma lista de até 300 linhas do arquivo. Claro que na prática não se faria assim, com tudo fixo, mas é só um exercício de introdução

 

Você lê as linhas, pode até mudar essa process_fields() que de nada serve para tratar cada linha:

  • pega o primeiro campo. Trivial: basta pegar o que veio na leitura e ir até a primeira vírgula, lá vai estar o número de oito dígitos que vai ser o critério de classificação.
  • copia a linha toda pro campo linha, sem olhar pra ela porque de nada serve

    Use o código que mostrei para inserir esse Registro na tabela, contando o valor em N. 

E pronto. leia as linhas direto pra tabela usando a rotina que mostrei e ao final pode usar um simples loop e mostrar todas as linhas porque estarão já na ordem, classificadas pelo insertion sort.

Abaixo está o enunciado da atividade

 

2. Desenvolver um programa em linguagem C que leia esse dataset (CSV) e ordene-o com base na primeira coluna. A ordenação escolhida deverá seguir o 5º dígito do seu RA

 

Se o 5º dígito do seu RA for:
0 ou 9: ordenar usando o BubbleSort
1 ou 8: ordenar usando o SelectionSort
2 ou 7: ordenar usando o InsertionSort
3 ou 6: ordenar usando o ShellSort
4 ou 5: ordenar usando o MergeSort

 

Como o quinto digito meu é 8, então eu devo organizar utilizando o Selection Sort, teria como você me mostrar como faria esse código com o meu arquivo csv(em anexo)?

ParticipantesSTRport.csv

Link para o comentário
Compartilhar em outros sites

Isso que te mostrei é o código. E a rotina que mostrei antes. E a lógica que está acima. O resto é só leitura e gravação mesmo

 

Esse é o código:

int     insere_registro(Registro* R, CSV* csv)
{
    if (csv->total >= csv->capacidade) return -1; // nao cabe
    int pos = csv->total;
    for (; pos > 0; pos = pos - 1)
    {
        if (csv->R[pos-1]->id > R->id)
            csv->R[pos] = csv->R[pos - 1];
        else
            break;
    };
    // achou o lugar
    csv->R[pos] = (Registro*)malloc(sizeof(Registro));
    csv->R[pos]->id = R->id;
    for (int i = 0; i < csv->campos; i += 1)
        csv->R[pos]->campo[i] = R->campo[i];
    csv->total += 1;
    return csv->total;
};

mas usa ponteiros e alocação dinâmica. No seu caso é bem mais simples: basta usar o contador N lá na estrutura que mostrei e copiar as linhas como declarado lá.

 

Digitando em  cima direto aqui seria algo assim

int     insere_registro(Registro* R, CSV* csv)
{
    int pos = csv->N;
    for (; pos > 0; pos = pos - 1)
    {
        if (csv->R[pos - 1].ispb > R->ispb)
            csv->R[pos] = csv->R[pos - 1];
        else
            break;
    };
    // achou o lugar
    csv->R[pos] = *R;
    csv->R[pos].ispb = R->ispb;
    csv->R[pos] = *R;
    csv->N += 1;
    return csv->N;
};

e mágica: o registro vai para a posição certa, na ordem

Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!