Muitos produtos de software que lidam com números e cálculos têm a capacidade de gerar dados em um arquivo de valores separados por vírgula (CSV). Esse formato pode ser uma maneira eficaz de transportar dados entre diferentes programas, pois é legível e bastante fácil de manipular. Muitos programas C que lidam com dados provavelmente terão que ler um arquivo CSV em algum momento.
Etapa 1
Consulte a documentação do programa que está fornecendo o arquivo CSV. Determine o número de campos em cada linha, bem como o formato de cada campo. Por exemplo, se um programa fornece um CSV com os seguintes dados:1, "teste", 34.5 Você marcaria três campos:um inteiro, uma string e um número de ponto flutuante.
Etapa 2
Crie uma estrutura contendo um membro de dados para cada campo identificado no CSV. Usando a linha de exemplo fornecida de 1, "test", 34.5, você precisaria da seguinte estrutura:struct data { int col1; caractere *col2; flutuar col3; };
Etapa 3
Crie um método em seu programa que irá lidar com a leitura do arquivo CSV. Isso precisará ser acessível ao resto do seu programa e provavelmente precisará trabalhar em estruturas de dados comuns para que outros métodos possam acessar os dados que foram lidos. Passe o parâmetro por referência para remover a necessidade de um valor de retorno . Um exemplo de protótipo de função seria:void ParseCSV( char *filename, data&input );
Etapa 4
Inclua o cabeçalho de E/S padrão usando o seguinte código:#include
Adicione este código ao topo do arquivo de origem que lerá o CSV.
Etapa 5
Inclua a biblioteca de strings para permitir a manipulação dos dados CSV usando o seguinte código:#include Adicione este código ao topo do arquivo de origem que lerá o CSV.
Etapa 6
Crie um objeto de arquivo, que irá ler os dados, utilizando o seguinte código:FILE * pInput;
Etapa 7
Crie um buffer de caracteres grande o suficiente para conter uma linha do arquivo por vez. Devido às restrições da linguagem, a maneira mais direta de fazer isso é declarar um array de caracteres de tamanho suficientemente grande, como em:#define BUFFER_SIZE 1024
char buf[BUFFER_SIZE];
Etapa 8
Abra o arquivo com o seguinte código e atribua-o ao seu objeto FILE criado anteriormente:pInput =fopen("filename," "r")
Etapa 9
Leia uma linha do arquivo usando o seguinte código:
fgets(buf, sizeof(buf), pInput)
Etapa 10
Analise o CSV usando a função "strtok". Crie uma nova string de caracteres para apontar para os tokens e inicialize-a com os dados da linha lida acima:char *tok =strtok(buf, ","")
Etapa 11
Converta o token recebido nos dados apropriados. Usando a linha de exemplo:1, "test", 3.45 converta os dados contidos em "tok" para um inteiro usando o seguinte código:row.col1 =atoi(tok);
Etapa 12
Para leituras subsequentes da mesma linha, passe "strtok" um parâmetro NULL em vez da string de buffer que você leu antes:tok =strtok(NULL, ","") Em seguida, converta o token para o tipo de dados apropriado. Usando a linha de exemplo 1,"test",3.45 O código de análise para uma única linha seria:char *tok =strtok(buf, ","); linha.col1 =atoi(tok); tok =strtok(NULL, ","); linha.col2 =tok; tok =strtok(NULL, ","); linha.col3 =atof(tok);
Etapa 13
Faça isso para todas as entradas em cada linha do CSV. A função "strtok" continuará a fornecer os dados entre os valores de vírgula até ficar sem dados no buffer, quando retornará NULL. Isso indicará que você terminou com a linha.
Dica
Encapsule sua conversão de dados em outro método para tornar o código mais legível. O método "fgets" retornará NULL quando o arquivo for completamente lido. Use isso em um loop while para percorrer todo o arquivo.
Aviso
A função "fopen" pode retornar NULL se houver um erro - certifique-se de verificar seu arquivo antes de usá-lo. Em alguns casos, os tokens fornecidos podem não ter o formato esperado. Certifique-se de examinar seus dados antes de converter cegamente, verificando os valores de erro comuns (a string vazia, NULL, etc).