CSV-fájl olvasása C-ben
Számos, számokkal és számításokkal foglalkozó szoftvertermék képes adatokat vesszővel tagolt érték (CSV) fájlba kiadni. Ez a formátum hatékony módja lehet az adatok különböző programok közötti átvitelének, mivel olvasható és meglehetősen könnyen kezelhető. Sok, adatokkal foglalkozó C programnak valószínűleg valamikor CSV-fájlból kell olvasnia.
1. lépés
Tekintse meg a CSV-fájlt biztosító program dokumentációját. Határozza meg az egyes sorokban lévő mezők számát, valamint az egyes mezők formátumát. Például, ha egy program a következő adatokat tartalmazza egy CSV-fájlban:1, "teszt", 34.5 Három mezőt kell megjelölnie:egy egész számot, egy karakterláncot és egy lebegőpontos számot.
2. lépés
Hozzon létre egy adattagot tartalmazó struktúrát a CSV-ben azonosított minden mezőhöz. Az 1-es példasort használva, a "teszt", 34.5 a következő struktúrára lesz szüksége:struct data { int col1; char *col2; float col3; };
3. lépés
Hozzon létre egy metódust a programban, amely kezeli a CSV-fájl olvasását. Ennek elérhetőnek kell lennie a program többi része számára, és valószínűleg közös adatstruktúrákon kell dolgoznia, hogy más módszerek is hozzáférhessenek a beolvasott adatokhoz. Adja át a paramétert hivatkozással, hogy ne legyen szükség visszatérési értékre . Példa a függvény prototípusára:void ParseCSV( char *fájlnév, adat&bemenet );
4. lépés
Adja meg a szabványos IO-fejlécet a következő kóddal:#include
5. lépés
Tartalmazza a karakterlánc-könyvtárat, amely lehetővé teszi a CSV-adatok kezelését a következő kóddal:#include
6. lépés
Hozzon létre egy fájlobjektumot, amely beolvassa az adatokat a következő kóddal:FILE * pInput;
7. lépés
Hozzon létre egy elég nagy karakterpuffert ahhoz, hogy a fájl egy sorát tárolja. A nyelv korlátai miatt ennek legegyszerűbb módja egy kellően nagy méretű karaktertömb deklarálása, például:#define BUFFER_SIZE 1024
char buf[BUFFER_SIZE];
8. lépés
Nyissa meg a fájlt a következő kóddal, és rendelje hozzá a korábban létrehozott FILE objektumhoz:pInput =fopen("fájlnév", "r")
9. lépés
Olvassa be a fájl egy sorát a következő kóddal:
fgets(buf, sizeof(buf), pInput)
10. lépés
Elemezze a CSV-fájlt az „strtok” függvény segítségével. Hozzon létre egy új karakterláncot, amely a tokenekre mutat, és inicializálja a fenti sorból származó adatokkal:char *tok =strtok(buf, ",")
11. lépés
Konvertálja a kapott tokent a megfelelő adatokká. A példasor segítségével:1, "test", 3.45 konvertálja a "tok"-ban található adatokat egész számmá a következő kóddal:row.col1 =atoi(tok);
12. lépés
Az ugyanabból a sorból történő további olvasáshoz adjon át "strtok" egy NULL paramétert az előzőleg beolvasott pufferkarakterlánc helyett:tok =strtok(NULL, ",") Ezután alakítsa át a tokent a megfelelő adattípusra. Az 1."test",3.45 példasort használva Egy sor elemzési kódja a következő lenne:char *tok =strtok(buf, ","); sor.col1 =atoi(tok); tok =strtok(NULL, ","); sor.col2 =tok; tok =strtok(NULL, ","); sor.col3 =atof(tok);
13. lépés
Tegye ezt a CSV minden sorában található összes bejegyzéshez. Az "strtok" függvény továbbra is biztosítja a vesszők közötti adatokat, amíg ki nem fogy a pufferből, ekkor NULL értéket ad vissza. Ez azt jelzi, hogy befejezte a sort.
Tipp
A kód olvashatóbbá tétele érdekében az adatkonverziót egy másik módszerbe ágyazza be. Az "fgets" metódus NULL értéket ad vissza, ha a fájlt teljesen elolvasta. Használja ezt egy while ciklusban a teljes fájl bejárásához.
Figyelmeztetés
Az "fopen" függvény NULL értéket adhat vissza, ha hiba történt – győződjön meg róla, hogy ellenőrizze a fájlt használat előtt. Egyes esetekben előfordulhat, hogy a megadott tokenek nem a várt formátumúak. A vakkonvertálás előtt feltétlenül vizsgálja meg adatait a gyakori hibaértékek (üres karakterlánc, NULL stb.) alapján.