Manipulação de arquivos CSV - Estruturado

Publicado por Fagner Amaral de Souza Candido (última atualização em 12/12/2010)

[ Hits: 25.123 ]

Homepage: https://github.com/fagnercandido

Download workCSV.c




Olá PessoALL,

O aplicativo a seguir tem por finalidade manipular arquivos CSV com a linguagem C. São funções básicas que, com toda certeza, podem e muito ser melhoradas. Mas de qualquer forma, demonstram uma possível forma de manipulação de arquivos CSV com a linguagem C.

Qualquer dúvida, crítica ou sugestão é só mandar.
f_Candido

  



Esconder código-fonte

/*
 * Sintese
 *    Objetivo : Manipular arquivos CSV em C
 *    Entrada : Um arquivo CSV
 *    Saida : Um arquivo CSV
 *    Autor : Fagner Candido - f_Candido - fagner7777777@gmail.com
 * */

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_LENGHT 100
#define MAX_STRING 3*MAX_LENGHT
#define MAX_LINE 100

// Tipo correspondente ao CSV
typedef struct fileCSV{
      char fNome[MAX_LENGHT];
      char mNome[MAX_LENGHT];
      char lNome[MAX_LENGHT];
}fileCSV;

// Open no Arquivo - Leitura
void fileOpenRead(FILE **pArquivo){
   if (!(*pArquivo=fopen("teste","r"))){
      printf("Erro ao Abrir Arquivo!!\n");
   }
}

// Open no Arquivo - Escrita
void fileOpenWrite(FILE **pArquivo){
   if (!(*pArquivo=fopen("teste","a+"))){
      printf("Erro ao Abrir Arquivo!!\n");
   }
}

// Write no Arquivo
void writeFile(FILE **pArquivo, char *dados){
       fprintf(*pArquivo, "%s" ,  dados);
}

// Read no Arquivo
int readFile(FILE **pArquivo, char stringOutput[MAX_LINE][MAX_STRING]){
   int contador = 0;
   while (!feof(*pArquivo))
    {
      fscanf(*pArquivo,"%s", stringOutput[contador]);
      contador++;
    } 
    return contador;
}

// Close no Arquivo
void closeFile(FILE **pArquivo){
   fclose(*pArquivo);
}

// Read Entradas
void readInputs(fileCSV *registro){
   printf("Informe o primeiro Nome\n");
   fgets(registro->fNome, MAX_LENGHT, stdin);
   printf("Informe o segundo Nome\n");
   fgets(registro->mNome, MAX_LENGHT, stdin);
   printf("Informe o ultimo Nome\n");
   fgets(registro->lNome, MAX_LENGHT, stdin);
}

//Mount arquivo CSV
void mountInput(char *stringInput, fileCSV registro){
   int len;
   strcat(stringInput, registro.fNome);
   len = strlen(stringInput);
   stringInput[len-1] = ',';
   stringInput[len] = '{FONTE}';
   strcat(stringInput, registro.mNome);
   len = strlen(stringInput);
   stringInput[len-1] = ',';
   stringInput[len] = '{FONTE}';
   strcat(stringInput, registro.lNome);
}

int main(int argc, char **argv){
      fileCSV registro;
      int contador = 0, auxiliar;
      char stringInput[MAX_STRING];
      char stringOutput[MAX_LINE][MAX_STRING];
      FILE *pArquivo;
      
      readInputs(®istro);
      mountInput(stringInput, registro);
      fileOpenWrite(&pArquivo);
      writeFile(&pArquivo, stringInput);
      closeFile(&pArquivo);
      fileOpenRead(&pArquivo);
      auxiliar = readFile(&pArquivo, stringOutput);
      for(;contador <= auxiliar;contador++){
         printf("Registros : %s\n", stringOutput[contador]);
      }
      closeFile(&pArquivo);
      return 0;
}

Scripts recomendados

Fwn - Formatador de arquivos .txt

Gerenciamento de alunos com dados armazenados em arquivo

Criando Playlist com o C#

Comandos de um Shell


  

Comentários
[1] Comentário enviado por eldermarco em 12/12/2010 - 10:42h

Interessante seu programa. Apenas uma observação é nas funções de abertura do arquivo: Ele gera uma mensagem de erro, mas não sai do programa. Isso pode gerar um erro atrás do outro se a abertura do arquivo falhar. Use a função exit e encerre o programa, caso ocorra alguma falha na abertura do arquivo. Outra coisa é: tente mostrar mensagens de erro na saída padrão de erros e não somente na saída padrão. Isso muitas vezes é útil em scripts onde você quer capturar somente a saída padrão ou somente a saída de erros, de forma que isso pode ser filtrado. Uma outra função útil para procurar em campos separados por vírgula, seria a função strtok(). Dê uma procurada nela na net. =)

Do mais, gostei. Abraços.

[2] Comentário enviado por philipe0136 em 14/11/2018 - 11:14h

Não entendi a parte que tem o
```
readInputs(®istro);
```
estou usando o codeblocks e esse "®" está dando erro, é para ser assim mesmo?

[3] Comentário enviado por f_Candido em 14/11/2018 - 11:25h


[2] Comentário enviado por philipe0136 em 14/11/2018 - 11:14h

Não entendi a parte que tem o
```
readInputs(®istro);
```
estou usando o codeblocks e esse "®" está dando erro, é para ser assim mesmo?


Acho que ao colocar no site, houve quebra de codificação. Acredito que seja readInputs(&registro);
Você também pode baixar o arquivo, isso não ocorre.


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts