Как читать CSV-файл в C
Многие программные продукты, работающие с числами и вычислениями, имеют возможность выводить данные в файл со значениями, разделенными запятыми (CSV). Этот формат может быть эффективным способом передачи данных между различными программами, поскольку он легко читается и им довольно легко манипулировать. Многим программам на C, работающим с данными, в какой-то момент, вероятно, придется читать из CSV-файла.
Шаг 1
Обратитесь к документации программы, предоставляющей CSV-файл. Определите количество полей в каждой строке, а также формат каждого поля. Например, если программа предоставляет CSV-файл со следующими данными:1, "тест", 34,5. Вы должны пометить три поля:одно целое, одну строку и одно число с плавающей запятой.
Шаг 2
Создайте структуру, содержащую элемент данных для каждого поля, указанного в CSV. Используя предоставленный пример строки 1, «тест», 34,5, вам понадобится следующая структура:struct data { int col1; символ *col2; плавающий столбец3; };
Шаг 3
Создайте в своей программе метод, который будет обрабатывать чтение CSV-файла. Это должно быть доступно для остальной части вашей программы и, вероятно, потребуется работать с общими структурами данных, чтобы другие методы могли получить доступ к прочитанным данным. Передайте параметр по ссылке, чтобы устранить необходимость в возвращаемом значении. . Примером прототипа функции может быть:void ParseCSV( char *filename, data&input );
Шаг 4
Включите стандартный заголовок ввода-вывода, используя следующий код:#include
Шаг 5
Включите библиотеку строк, чтобы разрешить манипулирование данными CSV, используя следующий код:#include
Шаг 6
Создайте файловый объект, который будет считывать данные, используя следующий код:FILE * pInput;
Шаг 7
Создайте буфер символов, достаточно большой, чтобы вместить одну строку файла за раз. Из-за ограничений языка самый простой способ сделать это — объявить массив символов достаточно большого размера, например:#define BUFFER_SIZE 1024
символ buf[BUFFER_SIZE];
Шаг 8
Откройте файл с помощью следующего кода и назначьте его ранее созданному объекту FILE:pInput =fopen("filename," "r")
Шаг 9
Прочитайте строку файла, используя следующий код:
fgets(buf, sizeof(buf), pInput)
Шаг 10
Разберите CSV с помощью функции «strtok». Создайте новую строку символов, указывающую на токены, и инициализируйте ее данными из строки, прочитанной выше:char *tok =strtok(buf, ",")
Шаг 11
Преобразуйте полученный токен в соответствующие данные. Используя строку примера:1, "test", 3.45 преобразуйте данные, содержащиеся в "tok", в целое число, используя следующий код:row.col1 =atoi(tok);
Шаг 12
При последующем чтении из той же строки передайте «strtok» параметр NULL вместо строки буфера, которую вы читали ранее:tok =strtok(NULL, ",") Затем преобразуйте токен в соответствующий тип данных. Используя пример строки 1, "test", 3.45 Код синтаксического анализа для одной строки будет таким:char *tok =strtok(buf, ","); row.col1 =atoi(ток); tok =strtok(NULL, ","); строка.col2 =ток; tok =strtok(NULL, ","); row.col3 =atof(ток);
Шаг 13
Сделайте это для всех записей в каждой строке CSV. Функция «strtok» будет продолжать предоставлять данные между значениями запятой, пока не закончатся данные в буфере, после чего она вернет NULL. Это будет означать, что вы закончили со строкой.
Совет
Инкапсулируйте преобразование данных в другой метод, чтобы сделать код более читабельным. Метод «fgets» вернет NULL, когда файл будет полностью прочитан. Используйте это в цикле while для обхода всего файла.
Предупреждение
Функция "fopen" может вернуть NULL, если произошла ошибка - обязательно проверьте файл перед ее использованием. В некоторых случаях предоставленные токены могут иметь не ожидаемый формат. Обязательно проверьте свои данные перед слепым преобразованием, проверяя распространенные значения ошибок (пустая строка, NULL и т. д.).