Προς το περιεχόμενο

Προτεινόμενες αναρτήσεις

Δημοσ.

χρησιμοποιώ την strtok για να διαβάσω ένα αρχείο .csv που είναι χωρισμένο με tabs. Το πρόβλημα μου είναι ότι κάποια πεδία είναι κενά και δεν μπορώ να βρω τρόπο για να το ελέγξω, γιατί η strtok τα προσπερνάει. Μπορείτε να μου προτείνετε κάποια λύση;

Δημοσ.

Τα .csv αρχεία είναι coma separated values οπότε αρκεί να περάσεις ως delimiter μονάχα το κόμα και την αλλαγή γραμμής και όλα τα υπόλοιπα θα τα διαβάσει κι ας είναι κενά.

 

>
	...
char delims[] = ",\n";
char *cp = NULL;
...

for ( cp=strtok( string, delims); cp; cp=strtok( NULL, delims) )
{
       	...
}

 

EDIT

 

Μόλις πρόσεξα πως γράφεις csv αρχεία αλλά μετά λες πως είναι χωρισμένα με tabs... δηλαδή δεν έχουν κόματα;

 

Όπως και να έχει, τους χαρακτήρες που θες να αγνοηθούν βάλε τους μέσα στο delims

Δημοσ.

Τα .csv αρχεία είναι coma separated values οπότε αρκεί να περάσεις ως delimiter μονάχα το κόμα και την αλλαγή γραμμής και όλα τα υπόλοιπα θα τα διαβάσει κι ας είναι κενά.

 

>
	...
char delims[] = ",\n";
char *cp = NULL;
...

for ( cp=strtok( string, delims); cp; cp=strtok( NULL, delims) )
{
       	...
}

 

EDIT

 

Μόλις πρόσεξα πως γράφεις csv αρχεία αλλά μετά λες πως είναι χωρισμένα με tabs... δηλαδή δεν έχουν κόματα;

 

Όπως και να έχει, τους χαρακτήρες που θες να αγνοηθούν βάλε τους μέσα στο delims

 

βασικά το πρόβλημά μου δεν είναι ακριβώς αυτό. για να καταλάβεις στο .csv έχω το εξής:

 

color year sex

red 1900 female

blue male

 

είναι όλα χωρισμένα με tabs και εγώ αυτό που θέλω είναι να ελέγχω αν στα πεδία εάν υπάρχει τιμή ή όχι. Στο παράδειγμα που μου ανέφερες εάν βάλω συνθήκη if(cp==NULL) μου χτυπάει.

Δημοσ.

Πες μου ακριβώς την εκφώνηση, γιατί μάλλον θα χρειαστεί να φτιάξεις μόνος σου έναν string-tokenizer (π.χ. όπως αυτόν εδώ που υπάρχει ήδη στη βιβλιοθήκη που φτιάχνω, ή σαν κι αυτόν εδώ που ακόμα δεν υπάρχει στον διαθέσιμο κώδικα της LIBS).

 

Αν δεν σε ενδιαφέρει η σειρά των πεδίων (π.χ. αν υπάρχει μόνο 1 token σε μια γραμμή του αρχείου τότε να θεωρούμε πως πρόκειται για το 1ο πεδίο, ενώ αν υπάρχουν 2 tokens να θεωρούμε πως αντιστοιχούν στα 2 πρώτα πεδία μας και όχι π.χ στο 1ο και στο 3ο ή στο 2ο και στο 3ο) τότε είναι σχετικά εύκολο να το κάνεις. Αν μας ενδιαφέρει η σειρά, τότε περιπλέκεται πολύ το πράγμα και θα χρειαστεί να προστεθεί έξτρα token στην αρχή της κάθε γραμμής του αρχείου, που να περιγράφει σε ποια πεδία αναφέρονται τα tokens που έπονται σε αυτή τη γραμμή.

Δημοσ.

Πες μου ακριβώς την εκφώνηση, γιατί μάλλον θα χρειαστεί να φτιάξεις μόνος σου έναν string-tokenizer (π.χ. όπως αυτόν εδώ που υπάρχει ήδη στη βιβλιοθήκη που φτιάχνω, ή σαν κι αυτόν εδώ που ακόμα δεν υπάρχει στον διαθέσιμο κώδικα της LIBS).

 

Αν δεν σε ενδιαφέρει η σειρά των πεδίων (π.χ. αν υπάρχει μόνο 1 token σε μια γραμμή του αρχείου τότε να θεωρούμε πως πρόκειται για το 1ο πεδίο, ενώ αν υπάρχουν 2 tokens να θεωρούμε πως αντιστοιχούν στα 2 πρώτα πεδία μας και όχι π.χ στο 1ο και στο 3ο ή στο 2ο και στο 3ο) τότε είναι σχετικά εύκολο να το κάνεις. Αν μας ενδιαφέρει η σειρά, τότε περιπλέκεται πολύ το πράγμα και θα χρειαστεί να προστεθεί έξτρα token στην αρχή της κάθε γραμμής του αρχείου, που να περιγράφει σε ποια πεδία αναφέρονται τα tokens που έπονται σε αυτή τη γραμμή.

 

 

βασικά έχω αυτό το αρχείο σε .csv και θέλω να μετατρέψω τις εγγραφές με τη μορφή

country year percentage

 

θεώρησα ότι θα έπρεπε να χρησιμοποιήσω strtok αλλά δεν ήξερα ότι θα έχω πρόβλημα με τα κενά πεδία

Δημοσ.

Μια γρήγορη λύση είναι σε εκείνο το αρχείο όποια έτη είναι κενά να τα μαρκάρεις με μια τιμή (π.χ. -1), την οποία κατόπιν θα την διαχειρίζεσαι ως κενή στο πρόγραμμά σου. Οπότε θα έχεις γραμμές της μορφής...

 

>
Greece	-1	-1	-1	1.789	-1	-1

 

Ακόμα πιο εύκολο είναι όταν κάνεις export τον πίνακα να του πεις να χρησιμοποιήσει κόματα και όχι tabs για διαχωριστικούς χαρακτήρες. Οπότε, θα έχεις γραμμές της μορφής...

 

>
Greece,,,,1.789,,,,

 

Και στις 2 παραπάνω περιπτώσεις γίνεται πλέον εύκολο να βρεις ποια έτη είναι κενά.

Δημοσ.

Μια γρήγορη λύση είναι σε εκείνο το αρχείο όποια έτη είναι κενά να τα μαρκάρεις με μια τιμή (π.χ. -1), την οποία κατόπιν θα την διαχειρίζεσαι ως κενή στο πρόγραμμά σου. Οπότε θα έχεις γραμμές της μορφής...

 

>
Greece	-1	-1	-1	1.789	-1	-1

 

Ακόμα πιο εύκολο είναι όταν κάνεις export τον πίνακα να του πεις να χρησιμοποιήσει κόματα και όχι tabs για διαχωριστικούς χαρακτήρες. Οπότε, θα έχεις γραμμές της μορφής...

 

>
Greece,,,,1.789,,,,

 

Και στις 2 παραπάνω περιπτώσεις γίνεται πλέον εύκολο να βρεις ποια έτη είναι κενά.

 

βασικά το δεύτερο πάλι δε γίνεται, γιατί η strtok αφαιρεί ότι βρει μπροστά της, δηλαδή θα μου επιστρέψει: Greece και μετά 1.789

με λίγα λόγια τα κόμματα (είτε ταμπς είτε οποιοδήποτε άλλο delimiter) τα αφαιρεί αμέσως μόλις τα δει. Έτσι δεν μπορώ να καταλάβω εάν υπάρχει κενό πεδίο.

 

Επίσης σχετικά με την πρώτη πρόταση, επειδή είναι πολλά τα αρχεία που πρέπει να επεξεργαστώ, δεν μπορώ να κάθομαι σε κάθε κενό του .xls να συμπληρώνω τιμή :/

Δημοσ.

Βάλε το Excel να σου κάνει export με κόματα. Το αρχείο που θα βγει βάλτο σε έναν text-editor (π.χ. Notepad++) και κάνε Search & Replace όπου κόμα με π.χ. ,-1 (δλδ κόμα ακολουθούμενο από -1) ή π.χ. κόμα και παύλα ,-

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...