Hur man läser en CSV-fil i C

click fraud protection

Se dokumentationen för programmet som tillhandahåller CSV-filen. Bestäm antalet fält på varje rad, samt formatet för varje fält. Till exempel, om ett program tillhandahåller en CSV med följande data: 1, "test", 34.5 Du skulle markera tre fält: ett heltal, en sträng och ett flyttal.

Skapa en struktur som innehåller en datamedlem för varje fält som identifieras i CSV: en. Med den medföljande exempelraden av 1, "test", 34.5 skulle du behöva följande struktur: struct data { int col1; char *col2; flyta col3; };

Skapa en metod i ditt program som kommer att hantera läsning av CSV-filen. Detta måste vara tillgängligt för resten av ditt program och kommer troligen att behöva arbeta med vanliga datastrukturer så att andra metoder kan komma åt data som har lästs in. Skicka parametern genom referens för att ta bort behovet av ett returvärde. Ett exempel på funktionsprototyp skulle vara: void ParseCSV( char *filnamn, data& input );

Skapa ett filobjekt som läser in data med följande kod: FILE * pInput;

Skapa en teckenbuffert som är tillräckligt stor för att rymma en rad i filen åt gången. På grund av språkets begränsningar är det enklaste sättet att göra detta att deklarera en teckenuppsättning av tillräckligt stor storlek, som med: #define BUFFER_SIZE 1024

Öppna filen med följande kod och tilldela den till ditt tidigare skapade FILE-objekt: pInput = fopen("filnamn," "r")

fgets (buf, sizeof (buf), pInput)

Analysera CSV-filen med funktionen "strtok". Skapa en ny teckensträng för att peka på tokens och initiera den med data från raden som läses in ovan: char *tok = strtok (buf, ",")

Konvertera den mottagna token till lämplig data. Med hjälp av exempelraden: 1, "test", 3.45 konvertera data som finns i "tok" till ett heltal med hjälp av följande kod: row.col1 = atoi (tok);

För efterföljande läsningar från samma rad, skicka "strtok" en NULL-parameter istället för buffertsträngen du läste in tidigare: tok = strtok (NULL, ","") Sedan konverterar du token till lämplig datatyp. Med hjälp av exemplet rad 1,"test",3.45. Parsningskoden för en enskild rad skulle vara: char *tok = strtok (buf, ","); rad.col1 = atoi (tok); tok = strtok (NULL, ","); rad.kol2 = tok; tok = strtok (NULL, ","); row.col3 = atof (tok);

Gör detta för alla poster på varje rad i CSV-filen. Funktionen "strtok" kommer att fortsätta att tillhandahålla data mellan kommavärden tills den tar slut på data i bufferten, vid vilken tidpunkt den returnerar NULL. Detta kommer att indikera att du är klar med raden.

Varning

Funktionen "fopen" kan returnera NULL om det uppstod ett fel - se till att kontrollera din fil innan du använder den. I vissa fall kanske de angivna tokens inte har det förväntade formatet. Se till att undersöka dina data innan du blindkonverterar genom att kontrollera mot vanliga felvärden (den tomma strängen, NULL, etc).