Jak číst soubor CSV v C

Prostudujte si dokumentaci k programu, který poskytuje soubor CSV. Určete počet polí v každém řádku a také formát každého pole. Pokud například program poskytuje CSV s následujícími daty: 1, "test", 34.5 Označili byste tři pole: jedno celé číslo, jeden řetězec a jedno číslo s pohyblivou řádovou čárkou.

Vytvořte strukturu obsahující datový člen pro každé pole identifikované v CSV. Pomocí poskytnutého příkladu řádku 1, "test", 34.5 byste potřebovali následující strukturu: struct data { int col1; char *col2; float col3; };

Vytvořte ve svém programu metodu, která bude zpracovávat čtení souboru CSV. To bude muset být přístupné zbytku vašeho programu a pravděpodobně bude nutné pracovat na společných datových strukturách, aby k načteným datům měly přístup jiné metody. Předejte parametr odkazem, abyste odstranili potřebu návratové hodnoty. Příkladem prototypu funkce by bylo: void ParseCSV( char *název souboru, data& vstup );

Vytvořte souborový objekt, který bude číst data, pomocí následujícího kódu: FILE * pInput;

Vytvořte dostatečně velkou vyrovnávací paměť znaků, aby se do ní vešel pouze jeden řádek souboru. Kvůli omezením jazyka je nejpřímějším způsobem, jak toho dosáhnout, deklarovat pole znaků dostatečně velké velikosti, jako u: #define BUFFER_SIZE 1024

Otevřete soubor s následujícím kódem a přiřaďte jej dříve vytvořenému objektu FILE: pInput = fopen("filename," "r")

fgets (buf, sizeof (buf), pInput)

Analyzujte CSV pomocí funkce "strtok". Vytvořte nový řetězec znaků, který bude ukazovat na tokeny, a inicializujte jej daty z řádku přečteného výše: char *tok = strtok (buf, ",")

Převeďte přijatý token na příslušná data. Pomocí příkladu řádku: 1, "test", 3.45 převeďte data obsažená v "tok" na celé číslo pomocí následujícího kódu: row.col1 = atoi (tok);

Pro další čtení ze stejného řádku předejte "strtok" parametr NULL namísto řetězce vyrovnávací paměti, který jste načetli dříve: tok = strtok (NULL, ",") Potom převeďte token na příslušný datový typ. Použití příkladu řádku 1,"test",3.45 Kód analýzy pro jeden řádek by byl: char *tok = strtok (buf, ","); row.col1 = atoi (tok); tok = strtok (NULL, ","); row.col2 = tok; tok = strtok (NULL, ","); row.col3 = atof (tok);

Udělejte to pro všechny položky na každém řádku CSV. Funkce "strtok" bude nadále poskytovat data mezi hodnotami čárkami, dokud nedojdou data ve vyrovnávací paměti, v tomto okamžiku vrátí hodnotu NULL. To bude znamenat, že jste s čárou skončili.

Varování

Funkce "fopen" může vrátit hodnotu NULL, pokud došlo k chybě - před použitím zkontrolujte svůj soubor. V některých případech nemusí mít poskytnuté tokeny očekávaný formát. Před slepým převodem zkontrolujte svá data tak, že je porovnáte s běžnými chybovými hodnotami (prázdný řetězec, NULL atd.).