csv auslesen
-
Hi, ich habe ein kleines Problem mit formatierter ein und ausgabe.
Bie folgendem Beispiel komme ich nicht voran:(level.csv)
Level;Kosten;Arbeitskraft;
0;20;50;
1;50;100;
2;75;130;
3;90;150;Nun kriege ich es nicht hin, beim auslesen die erste Zeile zu überspringen. Ausserdem wollt ich die LevelAngabe nicht miteinlesen.
Mein Ansatz.int main() { int i,j, level[4][2]; FILE *_level_csv; if( !( _level_csv = fopen(DATEI, "r") ) ) printf("Fehler\n"); else { for(i=0;i<4;i++) { fscanf(_level_csv, "\n"); //?? geht nicht for(j=0;j<2;j++) fscanf(_level_csv, "%d;", &level[i][j]); } fclose(_level_csv); return 0; }
Gibts da irgendeinen Weg oder gibt es gar bestimmte funktionen die mit excel files umgehen können und spezielle Felder adressieren können?
Gruss
Gabi
-
Habe deinen Code um das Lesen der ersten Zeile erweitert, und hoffentlich sicherer gemacht. Namen die mit "_" sind für die Compilerhersteller reserviert und sollten nicht benutzt werden.
Eine Zeile überspringen macht man einfach in dem man die Zeile liest und nicht bearbeitet.int argc, char *argv[ ]) { int i, level[4][2]; char line[128+1]; // das +1 ist eine Marotte von mir um den üblichen Fehler zu // vermeiden das für die schließende Null kein Platz mehr da ist. FILE *level_csv; if (2 != argc) // argc enthält die Anzahl der Argumente argv[0] ist der programmname dehalb 2 { printf("\n\nAnzahl Parameter incorrect\n Usage: progname infilename\n"); return(1); } if( !( level_csv = fopen(argv[1], "r") ) ) // Öffnen mit dem auf der Kommandozeile angegebenen Namen { printf("Fehler kann File nicht öffnen\n"); return (2); } if (NULL==fgets(line,128,level_csv)) // Lesen der ersten Zeile { printf("Fehler File hat keinen Inhalt\n"); return (3); } for(i=0;i<4;i++) { if(NULL==fgets(line,128,level_csv)) // lese der weiteren Zeilen { printf("Fehler Daten unvollständig\n"); return (4); } if (3!=sscanf(line,"%i;%i;%i",&level[i][0],&level[i][1],&level[i][2])) // returnwert: Anzahl erfolgreicher Konvertierungen. { printf("Fehler Datensatz unvollständig\n"); return (5); } } fclose(level_csv); return (0); }
-
Hallo, erstmal danke für die Hilfe :), funktioniert alles soweit. Eine Frage habe ich noch, ist es irgendwie möglich Variablennamen aus einer csv auszulesen? In der csv würde z.b. folgendes stehen:
POS_X;756.12;POS_X als String auszulesen ist kein Problem, nur wie verfahre ich dann diesen String als float Variable auszuwerten und 756.12 zuzuweisen? ist das überhaupt möglich oder gibt es noch einen anderen Weg?
Gruss
Gabi
-
indem du mit malloc Speicher allokierst:
float *point;point = (float malloc (sizeof(float));
*point = atof (StringMitDerFloatZahl);
-
wie ich floatzahl auslesen muss weiss ich, aber wie werte ich den string der Variablen POS_X aus, dass man im Programm die Variable POS_X verwenden kann? Ich beschäftige mich gerade mit der Auslagerung und Einlesung von Variablen in externen csv Dateien, komm an dieser Stelle aber nicht weiter.
Gruss
Gabi
-
Hat SirLant doch gezeigt. In seinem Beispiel wandest du einen String in eine float-Zahl um.
An der Stelle wo er StringMitDerFloatZahl müsstest du POS_X einsetzen. Dann benutzt du die float zahl (also bei SirLant point) im Programm.
code-Hacker
-
Über eines musst du dir halt im klaren sein, bei meiner jetztigen Methode
hast du ein Limit an Float-Zahlen (nämlich so viele Zeiger wie du definierst).
Du könntest statt meiner Methode auch folgendes machen:float zahlen[100]; zahlen[0] = atof (POS_X);
hier hast du aber 100 * den Speicher den eine Float-Variable belegt
Besser ist daher meine Methode:float *zahlen[100] // Ein Array aus 100 Float-zeigern zahlen[0] = (float *) malloc (sizeof (float)); *float = atof (POS_X);
Eine Möglichkeit in der du nahezu beliebig viele Variablen speichern kannst
wäre eine verkettete Liste:struct zahlen { struct zahlen *ZeigerAufNächstesElement; float WertVonPOS_X; } *zeiger; // Eine Struktur die den Wert von POS_X aufnehmen kann und einen Zeiger auf // die nächste Struktur bzw. Zahl besitzt /* Nun kannst du jedesmal wenn du eine weitere Zahl speichern möchtest einfach Die Kette aus diesen Strukturen durchgehen, bis du einen NULL-Zeiger findest, dann merkst du dir die Adresse von diesem Element und allokierst Speicher der größe dieser Struktur, du hast nun ein neues Kettenglied, dem Glied davor das du dir ja gemerkt hast gibst du die Adresse deines neuesten Elementes an und dem neuesten einen NULL-Zeiger so weißt du beim nächsten mal wieder wo du ein neues Anfügen kannst */ zeiger = (struct zahlen *) malloc (sizeof (struct zahlen)); // So zeigt der Zeiger zeiger auf ein neues Kettenglied, dieses musst du nur // noch einfügen
Wenn du noch nie mit verketteten Listen gearbeitet hast, kannst du diese nun
a) einsetzen um es zu lernen
b) es sein lassen und dich erstmal weiter einarbeitenEdit:
Hier mal ein Beispiel denke das ist besser verständlichstruct POS_X_Zahlen { struct POS_X_Zahlen *next; float wert; } *global_zeiger; // Benutzen wir um ein neues Glied zu erzeugen struct POS_X_zahlen *last; // letztes Element in Kette int main (void) { global_zeiger = (struct POS_X_Zahlen *) malloc (sizeof (struct POS_X_Zahlen)); global_zeiger->next = NULL; // Ende der Liste markieren global_zeiger->wert = atof (POS_X); // Weiße den Wert zu last = global_zeiger; // neues letztes Element // Nun kann ein neues Element folgen global_zeiger = (struct POS_X_Zahlen *) malloc (sizeof (struct POS_X_Zahlen)); global_zeiger->next = NULL; // Ende der Liste markieren global_zeiger->wert = atof (POS_X); // Weiße den Wert zu last = global_zeiger; // neues letztes Element }
In der Praxis sind dann natürlich Funktionen zum Eintragen eines neuen Elementes
Der Ausgabe aller Elemente, dem Suchen eines Elementes und dem Löschen noch nötig
je nachdem was du damit machen möchtest.