Πώς να διαβάσετε ένα αρχείο CSV στο C

Συμβουλευτείτε την τεκμηρίωση του προγράμματος που παρέχει το αρχείο CSV. Προσδιορίστε τον αριθμό των πεδίων σε κάθε γραμμή, καθώς και τη μορφή κάθε πεδίου. Για παράδειγμα, εάν ένα πρόγραμμα παρέχει ένα CSV με τα ακόλουθα δεδομένα: 1, "test", 34.5 Θα σημειώσετε τρία πεδία: έναν ακέραιο, μία συμβολοσειρά και έναν αριθμό κινητής υποδιαστολής.

Δημιουργήστε μια δομή που περιέχει ένα μέλος δεδομένων για κάθε πεδίο που προσδιορίζεται στο CSV. Χρησιμοποιώντας το παρεχόμενο παράδειγμα γραμμής 1, "test", 34.5 θα χρειαστείτε την ακόλουθη δομή: struct data { int col1; char *col2; float col3; };

Δημιουργήστε μια μέθοδο στο πρόγραμμά σας που θα χειρίζεται την ανάγνωση του αρχείου CSV. Αυτό θα πρέπει να είναι προσβάσιμο στο υπόλοιπο πρόγραμμά σας και πιθανότατα θα χρειαστεί να εργαστεί σε κοινές δομές δεδομένων, έτσι ώστε άλλες μέθοδοι να έχουν πρόσβαση στα δεδομένα που έχουν αναγνωσθεί. Περάστε την παράμετρο με αναφορά για να καταργήσετε την ανάγκη για μια τιμή επιστροφής. Ένα παράδειγμα πρωτότυπου συνάρτησης θα ήταν: void ParseCSV( char *filename, data& input );

Δημιουργήστε ένα αντικείμενο αρχείου, το οποίο θα διαβάζει τα δεδομένα, χρησιμοποιώντας τον ακόλουθο κώδικα: FILE * pInput;

Δημιουργήστε ένα buffer χαρακτήρων αρκετά μεγάλο ώστε να κρατά μία γραμμή του αρχείου κάθε φορά. Λόγω των περιορισμών της γλώσσας, ο πιο απλός τρόπος για να γίνει αυτό είναι να δηλώσετε έναν πίνακα χαρακτήρων επαρκώς μεγάλου μεγέθους, όπως με: #define BUFFER_SIZE 1024

Ανοίξτε το αρχείο με τον ακόλουθο κώδικα και αντιστοιχίστε το στο αντικείμενο FILE που δημιουργήσατε προηγουμένως: pInput = fopen("όνομα αρχείου", "r")

fgets (buf, sizeof (buf), pInput)

Αναλύστε το CSV χρησιμοποιώντας τη συνάρτηση "strtok". Δημιουργήστε μια νέα συμβολοσειρά χαρακτήρων για να δείχνει τα διακριτικά και αρχικοποιήστε την με δεδομένα από τη γραμμή που διαβάσατε παραπάνω: char *tok = strtok (buf, ",")

Μετατρέψτε το ληφθέν διακριτικό στα κατάλληλα δεδομένα. Χρησιμοποιώντας τη γραμμή παραδείγματος: 1, "test", 3.45 μετατρέψτε τα δεδομένα που περιέχονται στο "tok" σε έναν ακέραιο χρησιμοποιώντας τον ακόλουθο κώδικα: row.col1 = atoi (tok);

Για επόμενες αναγνώσεις από την ίδια γραμμή, περάστε "strtok" μια παράμετρο NULL αντί για τη συμβολοσειρά buffer που διαβάσατε πριν: tok = strtok (NULL, ",") Στη συνέχεια, μετατρέψτε το διακριτικό στον κατάλληλο τύπο δεδομένων. Χρησιμοποιώντας το παράδειγμα γραμμής 1,"test",3.45 Ο κώδικας ανάλυσης για μία γραμμή θα ήταν: char *tok = strtok (buf, ","); row.col1 = atoi (tok); tok = strtok (NULL, ","); row.col2 = tok; tok = strtok (NULL, ","); row.col3 = atof (tok);

Κάντε αυτό για όλες τις εγγραφές σε κάθε γραμμή του CSV. Η συνάρτηση "strtok" θα συνεχίσει να παρέχει τα δεδομένα μεταξύ των τιμών κόμματος μέχρι να εξαντληθούν τα δεδομένα στο buffer, οπότε θα επιστρέψει NULL. Αυτό θα δείξει ότι έχετε τελειώσει με τη γραμμή.

Προειδοποίηση

Η συνάρτηση "fopen" μπορεί να επιστρέψει NULL εάν υπήρχε κάποιο σφάλμα -- βεβαιωθείτε ότι έχετε ελέγξει το αρχείο σας πριν το χρησιμοποιήσετε. Σε ορισμένες περιπτώσεις, τα διακριτικά που παρέχονται μπορεί να μην είναι της αναμενόμενης μορφής. Βεβαιωθείτε ότι έχετε εξετάσει τα δεδομένα σας πριν πραγματοποιήσετε τυφλή μετατροπή, ελέγχοντας τις κοινές τιμές σφάλματος (την κενή συμβολοσειρά, NULL, κ.λπ.).