Following is an implementation of a program that can read and process line by line from a CSV
file with the format you specified:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define LINHA_MAX_TAM (1024 * 2) /* 2 KBytes */
struct cadastro_s
{
char * nomeparlamentar;
char * partido;
char * UF;
char * estado;
char * endereco;
char * anexo;
char * Econt;
char * gabinete;
char * Ecompl;
char * telefone;
char * fax;
char * mesniver;
char * dianiver;
char * email;
char * nomesacento;
char * tratamento;
char * profissao;
char * nomecivil;
};
typedef struct cadastro_s cadastro_t;
char ** strsplit( const char * src, const char * delim )
{
char * pbuf = NULL;
char * ptok = NULL;
int count = 0;
int srclen = 0;
char ** pparr = NULL;
srclen = strlen( src );
pbuf = (char*) malloc( srclen + 1 );
if( !pbuf )
return NULL;
strcpy( pbuf, src );
ptok = strtok( pbuf, delim );
while( ptok )
{
pparr = (char**) realloc( pparr, (count+1) * sizeof(char*) );
*(pparr + count) = strdup(ptok);
count++;
ptok = strtok( NULL, delim );
}
pparr = (char**) realloc( pparr, (count+1) * sizeof(char*) );
*(pparr + count) = NULL;
free(pbuf);
return pparr;
}
void strsplitfree( char ** strlist )
{
int i = 0;
while( strlist[i])
free( strlist[i++] );
free( strlist );
}
cadastro_t * parse_cadastro( char * linha )
{
char ** pp = NULL;
cadastro_t * cad = NULL;
pp = strsplit( linha, ";" );
cad = (cadastro_t*) calloc( 1, sizeof(cadastro_t) );
cad->nomeparlamentar = strdup(pp[0]);
cad->partido = strdup(pp[1]);
cad->UF = strdup(pp[2]);
cad->estado = strdup(pp[3]);
cad->endereco = strdup(pp[4]);
cad->anexo = strdup(pp[5]);
cad->Econt = strdup(pp[6]);
cad->gabinete = strdup(pp[7]);
cad->Ecompl = strdup(pp[8]);
cad->telefone = strdup(pp[9]);
cad->fax = strdup(pp[10]);
cad->mesniver = strdup(pp[11]);
cad->dianiver = strdup(pp[12]);
cad->email = strdup(pp[13]);
cad->nomesacento = strdup(pp[14]);
cad->tratamento = strdup(pp[15]);
cad->profissao = strdup(pp[16]);
cad->nomecivil = strdup(pp[17]);
strsplitfree( pp );
return cad;
}
void destroy_cadastro( cadastro_t * cad )
{
free(cad->nomeparlamentar);
free(cad->partido);
free(cad->UF);
free(cad->estado);
free(cad->endereco);
free(cad->anexo);
free(cad->Econt);
free(cad->gabinete);
free(cad->Ecompl);
free(cad->telefone);
free(cad->fax);
free(cad->mesniver);
free(cad->dianiver);
free(cad->email);
free(cad->nomesacento);
free(cad->tratamento);
free(cad->profissao);
free(cad->nomecivil);
free(cad);
}
void show_cadastro( cadastro_t * cad )
{
printf( "[ CADASTRO ]\n" );
printf( " Nome Parlamentar: %s\n", cad->nomeparlamentar );
printf( " Partido: %s\n", cad->partido );
printf( " UF: %s\n", cad->UF );
printf( " Estado: %s\n", cad->estado );
printf( " Endereco: %s\n", cad->endereco );
printf( " Anexo: %s\n", cad->anexo );
printf( " Endereco: %s\n", cad->Econt );
printf( " Gabinete: %s\n", cad->gabinete );
printf( " Complemento: %s\n", cad->Ecompl );
printf( " Telefone: %s\n", cad->telefone );
printf( " Fax: %s\n", cad->fax );
printf( " Aniversario: %s/%s\n", cad->dianiver, cad->mesniver );
printf( " E-mail: %s\n", cad->email );
printf( " Nome: %s\n", cad->nomesacento );
printf( " Tratamento: %s\n", cad->tratamento );
printf( " Profissao: %s\n", cad->profissao );
printf( " Nome Civil: %s\n", cad->nomecivil );
printf( "\n" );
}
int main( int argc, char * argv[] )
{
char linha[ LINHA_MAX_TAM + 1 ];
cadastro_t * c = NULL;
FILE * fp = NULL;
fp = fopen( argv[1], "r" );
while( fgets( linha, LINHA_MAX_TAM, fp ) )
{
c = parse_cadastro( linha );
show_cadastro( c );
destroy_cadastro( c );
}
fclose(fp);
return 0;
}
Test file deputados.csv
:
ALEX CANZIANI;PTB;PR;T;Câmara dos Deputados, Edifício Anexo;4;, gabinete nº;842;Brasília - DF - CEP 70160-900;3215-5842;3215-2842;06;11;[email protected];ALEX CANZIANI;Exmo. Senhor Deputado;Registrador de Imóveis;ALEX CANZIANI SILVEIRA
ALEX MANENTE;PPS;SP;T;Câmara dos Deputados, Edifício Anexo;4;, gabinete nº;245;Brasília - DF - CEP 70160-900;3215-5245;3215-2245;08;22;[email protected];ALEX MANENTE;Exmo. Senhor Deputado ;Bacharel Em Direito;ALEX SPINELLI MANENTE
BRUNNY;PR;MG;T;Câmara dos Deputados, Edifício Anexo;4;, gabinete nº;260;Brasília - DF - CEP 70160-900;3215-5260;3215-2260;08;21;[email protected];BRUNNY;Exma. Senhora Deputada;Superior Incompleto;BRUNIELE FERREIRA GOMES
Testing:
$ ./cadastro deputados.csv
[ CADASTRO ]
Nome Parlamentar: ALEX CANZIANI
Partido: PTB
UF: PR
Estado: T
Endereco: Câmara dos Deputados, Edifício Anexo
Anexo: 4
Endereco: , gabinete nº
Gabinete: 842
Complemento: Brasília - DF - CEP 70160-900
Telefone: 3215-5842
Fax: 3215-2842
Aniversario: 11/06
E-mail: [email protected]
Nome: ALEX CANZIANI
Tratamento: Exmo. Senhor Deputado
Profissao: Registrador de Imóveis
Nome Civil: ALEX CANZIANI SILVEIRA
[ CADASTRO ]
Nome Parlamentar: ALEX MANENTE
Partido: PPS
UF: SP
Estado: T
Endereco: Câmara dos Deputados, Edifício Anexo
Anexo: 4
Endereco: , gabinete nº
Gabinete: 245
Complemento: Brasília - DF - CEP 70160-900
Telefone: 3215-5245
Fax: 3215-2245
Aniversario: 22/08
E-mail: [email protected]
Nome: ALEX MANENTE
Tratamento: Exmo. Senhor Deputado
Profissao: Bacharel Em Direito
Nome Civil: ALEX SPINELLI MANENTE
[ CADASTRO ]
Nome Parlamentar: BRUNNY
Partido: PR
UF: MG
Estado: T
Endereco: Câmara dos Deputados, Edifício Anexo
Anexo: 4
Endereco: , gabinete nº
Gabinete: 260
Complemento: Brasília - DF - CEP 70160-900
Telefone: 3215-5260
Fax: 3215-2260
Aniversario: 21/08
E-mail: [email protected]
Nome: BRUNNY
Tratamento: Exma. Senhora Deputada
Profissao: Superior Incompleto
Nome Civil: BRUNIELE FERREIRA GOMES