Не могу разобраться как работать с csv файлами - C (СИ)
Формулировка задачи:
Доброе утро.
Программу пишу на С.
Смотрел такие библиотеки:
- http://sourceforge.net/projects/libcsv/
- http://gerbv.geda-project.org/doxygen/csv_8c-source.html
Решение задачи: «Не могу разобраться как работать с csv файлами»
textual
Листинг программы
#include <stdio.h>
#include <stdlib.h>
#include "csv.h"
/// структура для подсчета полей и записей
struct counts
{
long unsigned fields;
long unsigned rows;
};
/// обнаружено поле
void cb1 (void *s, size_t len, void *data)
{
((struct counts *)data)->fields++;
((char*)s)[len]='\0';/// подготовим вывод символов
printf("%s\t",(char*)s);
}
/// обнаружена запись
void cb2 (int c, void *data)
{
((struct counts *)data)->rows++;
printf("\n");
}
int main (int argc, char *argv[])
{
FILE *fp;
struct csv_parser p;
char buf[1024];
size_t bytes_read;
struct counts c = {0, 0};
if (csv_init(&p, 0) != 0) exit(EXIT_FAILURE);
//fp = fopen(argv[1], "rb");
fp = fopen("1.csv", "rb");
if (!fp) exit(EXIT_FAILURE);
csv_set_delim(&p, ';');/// установим символ-разделитель
while ((bytes_read=fread(buf, 1, 1024, fp)) > 0)
if (csv_parse(&p, buf, bytes_read, cb1, cb2, &c) != bytes_read)
{
fprintf(stderr,"Error while parsing file: %s\n",
csv_strerror(csv_error(&p)) );
exit(EXIT_FAILURE);
}
csv_fini(&p, cb1, cb2, &c);
fclose(fp);
printf("%lu fields, %lu rows\n", c.fields, c.rows);
csv_free(&p);
exit(EXIT_SUCCESS);
}
Объяснение кода листинга программы
- Включаются необходимые заголовочные файлы.
- Определяется структура
countsдля подсчета количества полей и записей. - Определяются функции обратного вызова
cb1иcb2, которые вызываются при обнаружении поля и записи соответственно. - В функции
mainоткрывается файл1.csvдля чтения в бинарном режиме. - Устанавливается разделитель по умолчанию - точка с запятой.
- Создается экземпляр
csv_parserи инициализируется. - В цикле, пока есть данные для чтения, происходит чтение данных из файла и их разбор с помощью
csv_parse. - Если разбор данных некорректен, выводится сообщение об ошибке и программа завершается с кодом ошибки.
- Закрывается файл и выводится количество полей и записей.
- Все ресурсы освобождаются и программа завершается с кодом успеха.