Ir ao conteúdo
  • Cadastre-se

C Manipulação de Arquivos csv


johnkaos

Posts recomendados

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
Link para o comentário
Compartilhar em outros sites

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!

Link para o comentário
Compartilhar em outros sites

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

 

 

 

Link para o comentário
Compartilhar em outros sites

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!

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