Как да четете CSV файл в C

Консултирайте се с документацията на програмата, която предоставя CSV файла. Определете броя на полетата във всеки ред, както и формата на всяко поле. Например, ако дадена програма предоставя CSV със следните данни: 1, "тест", 34.5 Вие ще маркирате три полета: едно цяло число, един низ и едно число с плаваща запетая.

Създайте структура, съдържаща член на данните за всяко поле, идентифицирано в CSV. Използвайки предоставения примерен ред от 1, "test", 34.5, ще ви е необходима следната структура: struct data { int col1; char *col2; float col3; };

Създайте метод във вашата програма, който ще обработва четенето на CSV файла. Това ще трябва да бъде достъпно за останалата част от вашата програма и вероятно ще трябва да работи върху общи структури от данни, така че други методи да имат достъп до данните, които са били прочетени. Предайте параметъра чрез препратка, за да премахнете необходимостта от връщана стойност. Примерен прототип на функцията би бил: void ParseCSV( char *filename, data& input );

Създайте файлов обект, който ще чете данните, като използвате следния код: FILE * pInput;

Създайте буфер за знаци, достатъчно голям, за да побере един ред от файла в даден момент. Поради ограниченията на езика, най-лесният начин да направите това е да декларирате символен масив с достатъчно голям размер, както е с: #define BUFFER_SIZE 1024

Отворете файла със следния код и го присвоете на вашия предварително създаден FILE обект: pInput = fopen("filename," "r")

fgets (buf, sizeof (buf), pInput)

Анализирайте CSV с помощта на функцията "strtok". Създайте нов низ от знаци, който да сочи към токените и го инициализирайте с данни от прочетения по-горе ред: char *tok = strtok (buf, ",")

Преобразувайте получения токен в съответните данни. Използвайки примерния ред: 1, "test", 3.45 преобразувайте данните, съдържащи се в "tok" в цяло число, като използвате следния код: row.col1 = atoi (tok);

За последващи четения от същия ред, подайте "strtok" параметър NULL вместо буферния низ, който сте чели преди: tok = strtok (NULL, ",") След това преобразувайте маркера в подходящия тип данни. Използвайки примерния ред 1,"test",3.45 Кодът за синтактичен анализ за един ред ще бъде: char *tok = strtok (buf, ","); row.col1 = atoi (tok); tok = strtok (NULL, ","); ред.col2 = tok; tok = strtok (NULL, ","); row.col3 = atof (tok);

Направете това за всички записи на всеки ред на CSV. Функцията "strtok" ще продължи да предоставя данните между стойностите на запетаята, докато не изчерпи данните в буфера, в който момент ще върне NULL. Това ще покаже, че сте приключили с линията.

Внимание

Функцията "fopen" може да върне NULL, ако е имало грешка - не забравяйте да проверите файла си, преди да го използвате. В някои случаи предоставените токени може да не са в очаквания формат. Уверете се, че сте проверили данните си, преди да конвертирате на сляпо, като проверите стойностите на често срещаните грешки (празен низ, NULL и т.н.).