Kako čitati CSV datoteku u C

click fraud protection

Pogledajte dokumentaciju programa koji daje CSV datoteku. Odredite broj polja u svakom retku, kao i format svakog polja. Na primjer, ako program daje CSV sa sljedećim podacima: 1, "test", 34.5 Označili biste tri polja: jedan cijeli broj, jedan niz i jedan broj s pomičnim zarezom.

Izradite strukturu koja sadrži člana podataka za svako polje identificirano u CSV-u. Koristeći navedeni primjer retka od 1, "test", 34.5, trebat će vam sljedeća struktura: struct data { int col1; char *col2; float col3; };

Napravite metodu u svom programu koja će upravljati čitanjem CSV datoteke. To će morati biti dostupno ostatku vašeg programa i vjerojatno će morati raditi na uobičajenim strukturama podataka kako bi druge metode mogle pristupiti podacima koji su učitani. Proslijedite parametar referencom kako biste uklonili potrebu za povratnom vrijednošću. Primjer prototipa funkcije bi bio: void ParseCSV( char *ime datoteke, podaci& input);

Napravite objekt datoteke, koji će čitati podatke, koristeći sljedeći kod: FILE * pInput;

Napravite međuspremnik znakova dovoljno velik da zadrži jedan po jedan redak datoteke. Zbog ograničenja jezika, najjednostavniji način da to učinite je deklariranje niza znakova dovoljno velike veličine, kao s: #define BUFFER_SIZE 1024

Otvorite datoteku sa sljedećim kodom i dodijelite je svom prethodno kreiranom objektu FILE: pInput = fopen("filename," "r")

fgets (buf, sizeof (buf), pInput)

Analizirajte CSV pomoću funkcije "strtok". Izradite novi niz znakova koji će upućivati ​​na tokene i inicijalizirati ga podacima iz reda koji je pročitan iznad: char *tok = strtok (buf, ",")

Pretvorite primljeni token u odgovarajuće podatke. Koristeći primjer retka: 1, "test", 3.45 pretvoriti podatke sadržane u "tok" u cijeli broj koristeći sljedeći kod: row.col1 = atoi (tok);

Za naknadna čitanja iz istog retka, proslijedite "strtok" parametar NULL umjesto niza međuspremnika koji ste prethodno pročitali: tok = strtok (NULL, ",") Zatim pretvorite token u odgovarajući tip podataka. Koristeći primjer retka 1,"test",3.45 Kod za raščlanjivanje za jedan redak bi bio: char *tok = strtok (buf, ","); red.col1 = atoi (tok); tok = strtok (NULL, ","); red.col2 = tok; tok = strtok (NULL, ","); red.col3 = atof (tok);

Učinite to za sve unose u svakom retku CSV-a. Funkcija "strtok" nastavit će pružati podatke između vrijednosti zareza sve dok ne ponestane podataka u međuspremniku, nakon čega će vratiti NULL. To će značiti da ste završili s linijom.

Upozorenje

Funkcija "fopen" može vratiti NULL ako je došlo do pogreške - svakako provjerite svoju datoteku prije korištenja. U nekim slučajevima, ponuđeni tokeni možda neće biti u očekivanom formatu. Obavezno provjerite svoje podatke prije slijepog pretvaranja provjeravajući uobičajene vrijednosti pogreške (prazan niz, NULL, itd.).