Ir ao conteúdo
  • Cadastre-se

C Ler Arquivo csv e ordenar usando InsertionSort


Posts recomendados

Boa noite.

Conheço bem pouco sobre linguagem C e estou precisando de ajuda, preciso de um programa escrito em c e usando o método InsertionSort que lê a exiba os dados ordenados pela primeira coluna.

Já tentei quase tudo que encontrei na internet e não consegui.

se puderem me ajudar ficarei muito grato.

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

#define DELIMITADOR ","

typedef struct {
	int   Codigo ;
	char  Fid[50];
	char  Empreendimento[150];
	char  Subeixo[10];
	char  Tipo[30];
	char  OrgaoResponsavel[50];
	char  Executar[150];
	char  UnidadeFederal[30];
	char  Municipio[300];
	char  Investimento[50];
	char  Observacao[50];
	char  Estagio[15];
	char  DataReferencia[10];
	char  Geometria[50];	
} campos;

int main()
{
	setlocale(LC_ALL, "");
    campos  z[14];
    campos *b[14];
	char   *campo;    
    int     i, j ,lin ,cont,row_count;
    char    linha[600]; 
    char   *titulo[1500];
    
    //Ler Arquivo
    FILE *arquivo;
    arquivo = fopen("geracao_energia.csv", "r");
        if (arquivo == NULL){
		printf("Não é possivel abrir o arquivo %s",arquivo);
		exit(1);
		}
    cont =0;
    row_count =0;
    while(fgets(linha, sizeof linha, arquivo) != NULL)
    {   
	row_count++;	
        	// separa texto tabulados	              
	        campo = strtok(linha, DELIMITADOR);        
	        while( campo != NULL ) 
	        {	
				//Adiciona cada palavra no vetor
        		titulo[i] = strdup(campo);        										
				campo = strtok(NULL, DELIMITADOR); 		
        		i++;
	        }
				i=0; 
				// Incrementa a lista
				z[cont].Codigo, titulo[i],i++; 
				strcpy(z[cont].Fid, titulo[i]),i++ ;
				strcpy(z[cont].Empreendimento, titulo[i] ),i++ ;
				strcpy(z[cont].Subeixo, titulo[i] ),i++ ;
				strcpy(z[cont].Tipo, titulo[i] ),i++ ;
				campo = strtok(NULL, DELIMITADOR),i++; 		
			}
   		
		cont++;
	}
    
    /* Ordena os endereços nos ponteiros usando um simples algoritmo de 
    ordenação por inserção (Insertion Sort): */
    b[0] = &z[0];
    for(i=1; i<3; i++){
        for (j = i; j>0 && z[i].Codigo < (*b[j-1]).Codigo; j--){
            b[j] = b[j-1];
        }
        b[j] = &z[i];
    }

    /*Então basta acessar os valores em sequência usando os ponteiros, 
    mas observe que z não sofreu nenhuma alteração.*/
    for(i=0; i<3; i++){
        printf("%d ---> %s\n", (*b[i]).Codigo, (*b[i]).Fid);
        printf("%d ---> %s\n", (*b[i]).Codigo, (*b[i]).Empreendimento);
        printf("%d ---> %s\n", (*b[i]).Codigo, (*b[i]).Subeixo);
        printf("%d ---> %s\n", (*b[i]).Codigo, (*b[i]).Tipo);
        
    }

    return 0;
}

geracao_energia.csv

Link para o comentário
Compartilhar em outros sites

Se você está até procurando usar insertion sort e está inserindo todos os dados no vetor, porque já não insere na ordem usando ...  insertion sort? Porque insere todos na ordem em que estão no arquivo para depois classificar, e usando curiosamente insertion sort num vetor onde acabou de inserir todos os dados? 

 

 

Link para o comentário
Compartilhar em outros sites

Esse problema é o mesmo discutido aqui?
 

 

Você já escreveu algum programa em C? Tem um livro? Conhece alguma outra  linguagem de programação?

 

3 minutos atrás, willian gersanti disse:

Muito obrigado por ter respondido, como te disse conheço muito pouco de C, entendi o que disse, porém me desculpe mas não sei como fazer, vou ver se uso sua sugestão e encontro algo


Selection, Insertion e Radix são os algoritmos de sort mais intuitivos, os que uma criança usa sem saber pra por coisas em ordem.  Acho que inserção é o primeiro que a pessoa tenta, porque você pega uma coisa e coloca no meio das outras já na ordem. 

 

Então perguntei isso agora porque sempre vejo as pessoas lendo os dados para dentro de um vetor na ordem em que estavam no arquivo, para só depois colocar em ordem, se na vida real ninguém jamais faira isso.
 

Imagine que vai classificar as cartas de um baralho e alguém vai te passando as cartas: você iria esperar receber todas para classificar ou já iria colocando na ordem? Esse é o insertion sort.

Ao ler você põe na ordem. Quando chega o último registro está tudo pronto. Se precisar parar no caminho é só marcar onde parou e depois retomar.

 

Selection Sort, ao vivo, em C

int     insere_do_disco(char* linha, int Len, Registro* FS)
{	
	if (FS->T >= FS->capacidade)
	{	//
		FS->capacidade += FS->bloco; // novo tamanho
		char** novo = realloc(FS->R, sizeof(char*) * FS->capacidade);
		if (novo != NULL) FS->R = novo;
	};	// if()
	int pos = FS->T;
	for (; pos > 0; pos = pos - 1)
	{
		if (strcmp(FS->R[pos - 1], linha) > 0)
			FS->R[pos] = FS->R[pos - 1];
		else
			break;
	};	// for()
	// achou o lugar
	FS->R[pos] = (char*)malloc(Len);
	strcpy(FS->R[pos], linha);
	FS->T += 1;
	return FS->T; // devolve o total de filmes atualizado
};

 

Essa função faria essa inserção por exemplo. A ideia é aquela da criança: vai vendo do fim pro começo se o valor que está entrando é maior que o que temos: se não é vai abrindo um espaço e puxando os caras pra cima até achar a posição certa, e lá coloca o novo. Desde o primeiro.

Quando ler o último--- e inserir o último ---  estará em 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...