CSV Datei erstellen und dann einlesen Prob

karasamazu

Grünschnabel
Hallo,
Ich bin schon seit einiger Zeit am programmiern wobei ich mein wissen haubtsächlich aus videotutorials hatte. jetzt hab ich mir c-programmierung von a bis z besorgt und komm aber an einer stelle nich weiter(habe die stelle einfach uebersprungen aber es quält mich das nich zu raffen). um den code auszuprobieren muss ich eine csv datei benutzen die folgende Werte enthält:
20:23,12.11.2001,20:50,12.11.2001,Pinguin // einlogzeit,einlogdatum,auslogzeit, auslogdatum, username
12:13,13.11.2001,15:29,13.11.2001,root
16:33,13.11.2001,20:23,13.11.2001,Mr.X
23:11,13.11.2001,01:12,14.11.2001,root
10:22,14.11.2001,12:14,14.11.2001,Spock
16:33,14.11.2001,20:21,14.11.2001,Scotty
ich kann mich auch erinnern das ein paar kapitel vorher ueber die kommandozeile mit programmname>sowieso.csv eine csv ausgegeben wurde. aber irgendwie raff ich nich ganz was genau da passiert ist. Wenn ich mit excel eine erstelle kann das programm sie nicht oeffnen. Frage ist also wie erstelle ich in C ,nicht c++, eine CSV mit den parametern die ich will.Welche parameter beeinflussen die CSV "WIE" und überhaubt. hab das nen paar mal gelesen(auch davor und danach) aber irgendwie is das thema nich recht behandelt worden. hatte 2-3 kapietel später das prob mit ner log datei. was für ne log datei und wo hat er die auf einmal her...und wenn ich keine habe wie erstell ich mir eine****und in welchem format? der code für den ich diese csv brauche lautet:
C++:
/* csv_log.c */
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char **argv) 
{
FILE *CSV;
int login_hour, login_min;
int date_day, date_mon, date_year;
char name[40];
int logout_hour, logout_min;
int date_dayx, date_monx, date_yearx;
if(argc < 2) {
fprintf(stderr, "Verwendung : %s datei.csv\n", *argv);
return EXIT_FAILURE;
}
CSV = fopen(argv[1], "r");
if(NULL == CSV) {
fprintf(stderr, "Fehler beim Oeffnen ...\n");
return EXIT_FAILURE;
}
/* Nun lesen Sie formatiert von der Datei ein ... */
while((fscanf(CSV,"%d:%d,%d.%d.%d,%d:%d,%d.%d.%d,%s\n",
&login_hour,&login_min,&date_day,&date_mon,&date_year,
&logout_hour,&logout_min,&date_dayx,&date_monx,
&date_yearx,name)) != EOF )
fprintf(stdout,"User:%s\nLogin um:%d:%d Uhr am %d.%d.%d\n"
"Logout um : %d:%d Uhr am %d.%d.%d\n\n",
name,login_hour,login_min,date_day,date_mon,date_year,
logout_hour,logout_min,date_dayx,date_monx, date_yearx);
return EXIT_SUCCESS;
}
es ärgert mich das ich sonst alles raff und ich wegen sowas plötzlich im wald steh^^

hoffe ich konnte mein problem klar darstellen und würd mich ueber antwort riesig freuen
 
Zuletzt bearbeitet von einem Moderator:
Hi.

CSV Dateien sind Textdateien die pro Zeile einen Datensatz enthalten, wobei die Einträge des Datensatzes mittels eines Trennzeichens separiert werden.

Nun gibt es viele unterschiedliche Möglichkeiten ein konkretes Format zu entwerfen. Man kann als Trennzeichen ein Komma wählen, oder ein Semikolon (wie Excel) oder, oder, oder.

Weiterhin kann man die einzelnen Einträge in doppelte Anführungszeichen setzen, oder auch nicht.
Oder man verwendet einfache Anführungszeichen, oder man verwendet Backslashes falls man ein Trennzeichen "entwerten" will etc.

Es ist also kein Wunder, das das Programm die von Excel erstellte .csv Datei nicht lesen kann.

Und wie du eine solche Datei erstellst? Na mit jedem beliebigen Texteditor kannst du dir so eine Datei erstellen. Du mußt dich nur an das Format halten.

Logdateien sind übrigens auch Textdateien, in Freiform wobei Einträge auch zeilenweise vorgenommen werden. Das ist also die Gemeinsamkeit zwischen CSV und Logdateien.

Das Programm macht also nichts weiter als Werte entsprechend dem (selbst definierten) Format einzulesen und auszugeben.
 
Zuletzt bearbeitet:
hm na so ähnlich hab ich mir das auch gedacht. ich frag mich blos warums dafür keine norm gibt. ein alptraum find ich wenn jeder da sein eigenes format hat.heisst das das ich bei sedem programm das ich schreibe immer ein spezielles/anderes format einhalten muss?(ander inhalt zb 2-3 spalten mer) Ich frage mich nur wie ich jetzt den code testen soll. und woher weiss ich welche trennzeichen mein compiler will?(Pelles C)........ich bin verwirrt...gedankengang>>aslo soll ich jetzt wie in diesem Beispiel einfach mit einem texteditor
12:13,13.11.2001,15:29,13.11.2001,root(\n) <<erkennt er dann das enter autom. als newline?
16:33,13.11.2001,20:23,13.11.2001,Mr.X(\n) << oder 16,33,13,11,2001,20,23,13,11,2001,name
//name in " " oder ' '?
23:11,13.11.2001,01:12,14.11.2001,root(\n)
10:22,14.11.2001,12:14,14.11.2001,Spock(\n)
16:33,14.11.2001,20:21,14.11.2001,Scotty(\n) eingeben? dann hab ich doch ne txt und er will/soll doch csv dateien lesen. oder soll ich die stumpf bei speichern unter..als.csv abspeichern
bekomm ich dann nich probleme bei sachen wie23(doppelpunkt)11. er erwartet doch ne dezimalzahl(%d)?

um meine verwirrung komplett zu machen hat er im buch nämlichein 2 dimensionales array mit werten belegt und dann einfach die csv ueber die kommandozeile "ausgestreamt" das hilft mir doch jetze null weiter oder?^^
 
Bitte halte dich an die Netiquette hier, insbesondere Groß-/Kleinschreibung. Deine Ergüsse sind sonst ziemlich unlesbar...

hm na so ähnlich hab ich mir das auch gedacht. ich frag mich blos warums dafür keine norm gibt.
Das CSV Format ist nunmal so definiert.
ein alptraum find ich wenn jeder da sein eigenes format hat.heisst das das ich bei sedem programm das ich schreibe immer ein spezielles/anderes format einhalten muss?(ander inhalt zb 2-3 spalten mer)
Jedes Programm hat sein eigenes Format. Das ist doch aber ganz selbstverständlich...
Ich frage mich nur wie ich jetzt den code testen soll. und woher weiss ich welche trennzeichen mein compiler will?(Pelles C)
Das hat überhaupt nichts mit dem Compiler zu tun. Wie schon gesagt ist das eine Festlegung die man bei der Programmierung trifft.
........ich bin verwirrt...gedankengang>>aslo soll ich jetzt wie in diesem Beispiel einfach mit einem texteditor
12:13,13.11.2001,15:29,13.11.2001,root(\n) <<erkennt er dann das enter autom. als newline?
16:33,13.11.2001,20:23,13.11.2001,Mr.X(\n) << oder 16,33,13,11,2001,20,23,13,11,2001,name
//name in " " oder ' '?
23:11,13.11.2001,01:12,14.11.2001,root(\n)
10:22,14.11.2001,12:14,14.11.2001,Spock(\n)
16:33,14.11.2001,20:21,14.11.2001,Scotty(\n) eingeben?
Das \n ist eine Zeilenendemarkierung, und ja, wenn du "Enter" in deinem Texteditor drückst dann ist das ein \n.
dann hab ich doch ne txt und er will/soll doch csv dateien lesen.
Die Dateiendung ist grundsätzlich völlig egal. Es kommt nur auf das Format an.
bekomm ich dann nich probleme bei sachen wie23(doppelpunkt)11. er erwartet doch ne dezimalzahl(%d)?
Wieso Probleme? Es wird %d:%d erwartet...
karasamazu hat gesagt.:
um meine verwirrung komplett zu machen hat er im buch nämlichein 2 dimensionales array mit werten belegt und dann einfach die csv ueber die kommandozeile "ausgestreamt" das hilft mir doch jetze null weiter oder?^^
Wofür denn weiter?

Wie man die CSV Datei erstellt ist doch ziemlich egal. Ob nun dynamisch von einem Programm oder manuell mit einem Texteditor.
 
Danke für deine geduldige Antworten^^ das er ja %d:%d erwartet hab ich zum Schluss sogar selber gesehen , aber da war es schon zu spät.
Ich habe es jetzt noch mal mit Texteditor versucht.
sowohl beispiel reinkopieren, als auch einzeln werte eingeben, also 20,30 für 20:30 die namen mit und ohne " " oder ' ' in als txt und csv abgespeichert da ja eigentlich egal... ich bekomm immer wieder die Meldung Fehler beim oeffnen.
 
Danke für deine geduldige Antworten^^ das er ja %d:%d erwartet hab ich zum Schluss sogar selber gesehen , aber da war es schon zu spät.
Ich habe es jetzt noch mal mit Texteditor versucht.
sowohl beispiel reinkopieren, als auch einzeln werte eingeben, also 20,30 für 20:30 die namen mit und ohne " " oder ' ' in als txt und csv abgespeichert da ja eigentlich egal... ich bekomm immer wieder die Meldung Fehler beim oeffnen.
Meine Glaskugel ist in Reparatur. Zeig bitte einfach deine Datei (man kann hier auch Dateien anhängen) und wie du das Programm aufrufst.

\edit: Einige Dinge könntest du vorher an dem Programm mal ändern.

Statt
C:
		fprintf(stderr, "Fehler beim Oeffnen ...\n");
einfach
C:
perror(argv[1]);
dann bekommst du in der Regel eine Meldung warum die Datei nicht geöffnet werden konnte.

Und die while Schleife solltest du auch ändern. Sonst läuft das Programm Gefahr in eine Endlosschleife zu geraten.
C:
	while((fscanf(CSV,"%d:%d,%d.%d.%d,%d:%d,%d.%d.%d,%s\n",
	              &login_hour,&login_min,&date_day,&date_mon,&date_year,
	              &logout_hour,&logout_min,&date_dayx,&date_monx,
	              &date_yearx,name)) == 11) {
  ...
}
 
Zuletzt bearbeitet:
Endlich hat es funktioniert. mit:
20,23,12,11,2001,20,50,12,11,2001,Pinguin
12,13,13,11,2001,15,29,13,11,2001,root
16,33,13,11,2001,20,23,13,11,2001,Mr.X
23,11,13,11,2001,01,12,14,11,2001,root
10,22,14,11,2001,12,14,14,11,2001,Spock
16,33,14,11,2001,20,21,14,11,2001,Scotty
Erst hatte er mir in einer Endlosschleife nur Unsinn ausgegeben, aber nachdem ich nen gefundenden Punkt zum Komma gemacht hatte, kam wenigstens kein Fehler mer. Das mit !=11 in der while-schleife führte aber dazu das garnichts mer passierte. deswegen hatte ich es noch mal mit der EOF Variante probiert und nu geht es endlich :).
danke nochmal für deine Geduld. Auch wenn es nur ne triviale Sache war aber sowas lässt mir einfach keine Ruhe.
 

Neue Beiträge

Zurück