Не могу разобраться как работать с csv файлами - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Доброе утро. Программу пишу на С. Смотрел такие библиотеки:
  • http://sourceforge.net/projects/libcsv/
  • http://gerbv.geda-project.org/doxygen/csv_8c-source.html
Понять как извлекать данные из csv при помощи этих библиотек не смог понять. Те примеры, которые нашел, мне ни о чем не говорят.

Решение задачи: «Не могу разобраться как работать с csv файлами»

textual
Листинг программы
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include "csv.h"
  4.  
  5. /// структура для подсчета полей и записей
  6. struct counts
  7. {
  8.     long unsigned fields;
  9.     long unsigned rows;
  10. };
  11.  
  12. /// обнаружено поле
  13. void cb1 (void *s, size_t len, void *data)
  14. {
  15.     ((struct counts *)data)->fields++;
  16.  
  17.    ((char*)s)[len]='\0';/// подготовим вывод символов
  18.     printf("%s\t",(char*)s);
  19. }
  20.  
  21. /// обнаружена запись
  22. void cb2 (int c, void *data)
  23. {
  24.     ((struct counts *)data)->rows++;
  25.     printf("\n");
  26. }
  27.  
  28. int main (int argc, char *argv[])
  29. {
  30.     FILE *fp;
  31.     struct csv_parser p;
  32.     char buf[1024];
  33.     size_t bytes_read;
  34.     struct counts c = {0, 0};
  35.     if (csv_init(&p, 0) != 0) exit(EXIT_FAILURE);
  36.     //fp = fopen(argv[1], "rb");
  37.     fp = fopen("1.csv", "rb");
  38.     if (!fp) exit(EXIT_FAILURE);
  39.  
  40.     csv_set_delim(&p, ';');/// установим символ-разделитель
  41.  
  42.     while ((bytes_read=fread(buf, 1, 1024, fp)) > 0)
  43.         if (csv_parse(&p, buf, bytes_read, cb1, cb2, &c) != bytes_read)
  44.         {
  45.             fprintf(stderr,"Error while parsing file: %s\n",
  46.                     csv_strerror(csv_error(&p)) );
  47.             exit(EXIT_FAILURE);
  48.         }
  49.     csv_fini(&p, cb1, cb2, &c);
  50.     fclose(fp);
  51.     printf("%lu fields, %lu rows\n", c.fields, c.rows);
  52.  
  53.  
  54.     csv_free(&p);
  55.     exit(EXIT_SUCCESS);
  56. }

Объяснение кода листинга программы

  1. Включаются необходимые заголовочные файлы.
  2. Определяется структура counts для подсчета количества полей и записей.
  3. Определяются функции обратного вызова cb1 и cb2, которые вызываются при обнаружении поля и записи соответственно.
  4. В функции main открывается файл 1.csv для чтения в бинарном режиме.
  5. Устанавливается разделитель по умолчанию - точка с запятой.
  6. Создается экземпляр csv_parser и инициализируется.
  7. В цикле, пока есть данные для чтения, происходит чтение данных из файла и их разбор с помощью csv_parse.
  8. Если разбор данных некорректен, выводится сообщение об ошибке и программа завершается с кодом ошибки.
  9. Закрывается файл и выводится количество полей и записей.
  10. Все ресурсы освобождаются и программа завершается с кодом успеха.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

10   голосов , оценка 4.2 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы