Ir ao conteúdo

Posts recomendados

Postado

image.png.cbaa626038646c97ef25c7dfdd0704b0.pngimage.png.7facc2da18d703d40efb695c4a9fca50.png

 

eu pretendo deixar os dois csv assim,no caso como o professor pediu.. 

adicionado 1 minuto depois

@arfneto aqui,ele compilou normal,porém na hora de criar o csv,ele cria um totalmente diferente do fprintf

adicionado 5 minutos depois

Eu rodei agora e ele deu esses resultados;

 

Diferente do exemplo que citei acima 😕

primeiroresult.csv resultadofinal.csv

  • Curtir 1
Postado
2 minutos atrás, johnkaos disse:

image.png.cbaa626038646c97ef25c7dfdd0704b0.pngimage.png.7facc2da18d703d40efb695c4a9fca50.png

 

eu pretendo deixar os dois csv assim,no caso como o professor pediu.. 

adicionado 1 minuto depois

@arfneto aqui,ele compilou normal,porém na hora de criar o csv,ele cria um totalmente diferente do fprintf

 

Acho melhor checar os parâmetros para scanf() por exemplo. E os valores de retorno.

 

Nenhum destes será um csv, como já expliquei. Mas é possível, claro. Não se esqueca dos headers!

Postado
1 hora atrás, johnkaos disse:

void leArquivoum(struct auxiliar *auxs); void leArquivodois(struct auxiliar *auxs);  void leArquivocsv(struct gdpperc *pib);

 Dessas 3.

Postado

Estou imaginando que está lendo tudo que eu escrevo. Mas não me perguntou nada. 

  • Deu uma olhada naquele documento sobre o formato csv?
  • Entendeu o primeiro post quando te falei que poderia usar qualquer programa para importar seus dados de entrada ou de saida se estivessem no formato correto? E assim usar o trabalho dos outros para testar o seu programa...
  • Entendeu o que está errado no enunciado?

Escrevi um pequeno programa para ler o seu gdp.csv para você entender o que eu quero dizer por escrever uma parte a cada vez.

 

A saida do programa deve ser um csv bem formado, ainda sem aquela bobagem do N. Essa é a primeira fase do enunciado, o pre-processamento.

  • veja as primeiras linhas que o programa mostra na tela

    exemplo.png.8bf73dbbee1f22ea0aaaa530f1086bf4.png
     
  • veja o arquivo de saida importado pelo Sheets

    Isso quer dizer que o formato está ok, os dados iniciais foram extraídos do primeiro arquivo
     
  • saida.thumb.png.6b5e6ccdd65d404791aec51ebfc9cfd5.png
  •  
  • veja o programa de teste
    #define _CRT_SECURE_NO_WARNINGS
    
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    #include <ctype.h>
    
    struct registro_saida
    {
        char* Pais;
        char* GDP;
        char* LS;
    };
    typedef struct registro_saida  OutRec;
    
    
    int main(int argc, char* argv)
    {
        // para scanf()
        char* mascara = "%[^;]%c%[^;]%c%[^;]%c%[^;]%c%[^;]%c%s%c";
    
        // o GDP.csv
        char* GDP_file_name = "gdp.csv";
        FILE* GDP_file;
    
        char  grade[8][80];
        char  delim1 = '?';
        int   n = 0;
    
        // para a saida
        char* CSV_output_file_name = "saida.csv";
        FILE* CSV_out;
        char* header_csv = "Pais;GDP;Life Satisfaction\r";
    
        OutRec* p = (OutRec*)malloc(sizeof(OutRec));
    
        GDP_file = fopen(GDP_file_name, "r");
    
        // trata o header
        if (GDP_file == NULL)
        {
            printf("nao abriu %s\n", GDP_file_name);
            perror("Erro:");
            return -1;
        }
        else
        {
            printf("abriu %s\n", GDP_file_name);
        };  // if()
        n = fscanf(GDP_file, mascara,
            &grade[0][0], &delim1,
            &grade[1][0], &delim1,
            &grade[2][0], &delim1,
            &grade[3][0], &delim1,
            &grade[4][0], &delim1,
            &grade[5][0], &delim1
        );
        printf("fscanf() retornou %d. Esperados 12\n", n);
        if (n != 12) exit(-1);
        printf("Eis os campos do CSV\n");
        for (int i = 0; i < (n / 2); i += 1)
            printf("Campo %d: [%s]\n", i, &grade[i][0]);
    
        //
        // agora le a entrada e cria uma struct para cada linha
        // e por enquanto vai gravando no csv de saida so pra
        // ver se o mecanismo esta ok
        //
        CSV_out = fopen(CSV_output_file_name, "w");
        if (CSV_out == NULL)
        {
            printf("nao abriu %s\n", CSV_output_file_name);
            perror("Erro:");
            return -1;
        };  // if()
        printf("abriu %s\n", CSV_output_file_name);
        fwrite(header_csv, strlen(header_csv), 1, CSV_out);
        char* LS_dummy = "A Calcular";
        int rec = 0;
        while (!feof(GDP_file))
        {
            n = fscanf(GDP_file, mascara,
                &grade[0][0], &delim1, // pais
                &grade[1][0], &delim1,
                &grade[2][0], &delim1,
                &grade[3][0], &delim1, 
                &grade[4][0], &delim1,
                &grade[5][0], &delim1 // GDP
            );
            if (n != 12) break;
            printf("Eis os campos do CSV\n");
            for (int i = 0; i < (n / 2); i += 1)
                printf("Campo %d: [%s]\n", i, &grade[i][0]);
            rec += 1;
            printf("Registro %d: fscanf() retornou %d. Esperados 12\n", rec, n);
            p->Pais = (char*) malloc( strlen(&grade[0][0]) + 1);
            strcpy(p->Pais, &grade[0][0]);
            p->GDP =  (char*) malloc( strlen(&grade[5][0]) + 1);
            strcpy(p->GDP, &grade[5][0]);
            p->LS =   (char*) malloc(strlen(LS_dummy) + 1);
            strcpy(p->LS, LS_dummy);
            fprintf(CSV_out, "%s;%s;%s\n", p->Pais, p->GDP, p->LS);
            
            free(p->Pais);
            free(p->GDP);
            free(p->LS);
    
        };  // while()
        printf("\nGRAVADOS %d registros\n", rec);
        free(p);
        fclose(GDP_file);
        fclose(CSV_out);
        return 0;
    };  // main()
    
    // https://www.clubedohardware.com.br/forums/topic/
    // 1422433-manipula%C3%A7%C3%A3o-de-arquivos-csv/?
    // tab=comments#comment-7683079

    Atente para a formatação do arquivo de saída por exemplo

        char* header_csv = "Pais;GDP;Life Satisfaction\r";

    Esse é o header do arquivo de saída. Depois disso o programa lê a entrada e prepara as estruturas seguindo esse formato. O arquivo CSV é uma tabela (X,Y) então o scanf() pode ler todas os campos do registro de uma vez, TODA VEZ. 
    scanf()  foi feita para isso: Scan Formatted Fields e quando scanf() foi escrita o formato CSV já existia :) 

    Esse scanf()
     

        n = fscanf(GDP_file, mascara,
            &grade[0][0], &delim1,
            &grade[1][0], &delim1,
            &grade[2][0], &delim1,
            &grade[3][0], &delim1,
            &grade[4][0], &delim1,
            &grade[5][0], &delim1
        );
        printf("fscanf() retornou %d. Esperados 12\n", n);

    le a linha todinha. Essa é a máscara:

        char* mascara = "%[^;]%c%[^;]%c%[^;]%c%[^;]%c%[^;]%c%s%c";

    Pense bem e vai entender que é a mesma coisa que você fez, só que mais segura e curtinha. E entenda porque há uma razão séria para scanf() retornar o número de itens lidos. E deve ser um problema sério a gente nunca ver aqui nos programas esse valor sendo usado...
     

  •  

  • Numa primeira fase a struct de saída pode ser só isso:

  • struct registro_saida
    {
        char* Pais;
        char* GDP;
        char* LS;
    };
    typedef struct registro_saida  OutRec;

     

  • Veja o código para extrair os dados
        while (!feof(GDP_file))
        {
            n = fscanf(GDP_file, mascara,
                &grade[0][0], &delim1, // pais
                &grade[1][0], &delim1,
                &grade[2][0], &delim1,
                &grade[3][0], &delim1, 
                &grade[4][0], &delim1,
                &grade[5][0], &delim1 // GDP
            );
    Veja a declaração
        char  grade[8][80];

    Vai ler seis campos de até 80 caracteres. E aí o programa aloca as strings na struct{} no tamanho certinho. Muito mais fácil.

  •  

  • Sugiro ler, testar, e talvez perguntar algo.

    Veja se ajuda em alguma coisa e se consegue imaginar o próximo passo...

 

 

 

Postado
21 horas atrás, johnkaos disse:

eu pretendo deixar os dois csv assim,no caso como o professor pediu.. 

 

Exite ampla gama de formatos de arquivo csv, o que seu professor propõe é um de muitos outros que não seguem as interpretações mais comuns, por exemplo, listadas na RFC 4180.

Deixar como diz é a coisa mais correta a se fazer, pois:

  • Não há Erro na formatação proposta para arquivos csv quanto a conformidade RFC do propicio documento ...
    Citação

    While there are various specifications and implementations for the CSV format [...] , there is no formal specification in existence ...

 

 

  • A Questão pode não ser o formato csv mais seguido pela maioria (tenho 99.99% de certeza).
  • Podemos nós também esquecer o que seria o formato correto (ou deixado para bem mais tarde essa discussão) ou nem se quer desperdiça mais tempo, pois pelo que entendo nada disso é cobrado.

 

Bons estudos!

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

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!