Probleme beim Einlesen einer .csv datei



  • SOoo habs mal hier rien verschoben da es im ersten bereich wohl falsch war:

    Hallo zusammen,
    hoffe hier auf ein wenig hilfe bei meinem Problem:
    Hab dazu schoneiniges an Tutorials und auch an Hilfen hier im Forum gelsen, komme aber trotzdem nicht auf den rihctigen Weg.

    Muss für ein kleines Auslegungsprogramm Daten aus eine .csv File, welches vorher mit Excel erstellt worden ist auslesen.

    Zu Testzwecken hab ich von Galileo Computing aus dem Tutorial die .csv Datei übernommen (siehe kapitel 18.9)

    wenn ich das ganze mit meinem Code einlese, bekomme ich scheinbar alles richtig ausgegeben:
    Datei:

    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

    Code:

    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 ) 
    { 
    cout << login_hour << ":" << login_min << name << endl; 
    };
    

    Ausgabe:

    20:23Pinguin
    12:13root

    ...

    16:33Scotty

    Im nächste Schritt habe ich mir eine eigene Datei mit Excel erzeugt, die mit dem Editor geöffnet folgendermassen aussieht:

    250;500;RM500
    800;750;RM800

    mit diesem Code wollte ich das ganze dann einlesen:

    TEST = fopen("C:\\Dokumente und Einstellungen\\praktikant\\Desktop\\TEST4.csv", "r"); 
    if(NULL == TEST) 
    { 
    printf("Konnte Datei nicht \x94 \bffnen!\n"); 
    } 
    U_P = -1; 
    U_n = -1; 
    while((fscanf(TEST,"%d;%d;%s\n", &U_P,&U_n,Name_Motor)) != EOF ) 
    { 
    cout << U_P << " " << U_n << " " << Name_Motor << endl; 
    };
    

    das Programm gibt mir dann aus:

    250 600 RM
    500 600 RM

    Die Variabeln sind identisch definiert. Die Syntax ist meines erachtens 1 zu 1 übertragen.
    Nur verstehe ich im Moment nicht was er da anderes macht :-(.
    Die 600 kommt im Programm überhaupt nicht vor....
    habe die variablen vorher extra mit werten gefüllt, die werde überschrieben ...

    Nur wo zaubert er zB die 600 als Wert her?



  • Stevewonda schrieb:

    Zu Testzwecken hab ich von Galileo Computing aus dem Tutorial die .csv Datei übernommen (siehe kapitel 18.9)

    Erwischt.
    Der Fachbuchautor deines o.g. Tutorials ist wahrscheinlich JW, da hast du halt Pech, dessen Schrott funktioniert meist nicht und anhand dessen Codes ist fehlerfreies Lernen unmöglich.



  • Was passiert eigentlich bei deinem Programm, wenn die Datei nicht geöffnet werden konnte?

    EDIT: Dein Programm funktioniert bei mir übrigens wie gewünscht. Also ist vermutlich entweder deine Datei oder dein Code anders als hier gepostet.

    EDIT2: Und beim nächsten Mal bitte cpp-Tags verwenden! Dann liest man sich den Code auch lieber durch und du kriegst wahrscheinlich mehr Antworten.



  • @Wutz:

    das hört sich nicht gut an 😞

    hab lange gesucht nach nem tutorial um .csv dateien einzulesen und war froh überhaupt was gefunden zu haben ...

    @_matze:

    Meintest du es so mit den tags? Hoffe es passt jetzt besser ..

    Der Code hier ist mit copy/paste aus meinem Quellcode kopiert.

    was gibt er den bei dri aus?

    Das hier:

    250 600 RM
    500 600 RM

    Oder das was er ausgeben sollte:

    250 500 RM500
    800 750 RM800

    Wenn er das zweite ausgibt frage ich mich warum er das bei mir nicht tut ich hab genau das da stehen was ich als Code eingegeben habe:-(

    Hier mal meien dazugehörigen variablen deklaration und die Include dateien :

    #include <windows.h>
    #include <iostream> 
    #include <fstream>
    #include <string>
    #include <math.h>
    #include <time.h>
    #include <windows.h>
    #include <stdio.h>
    #include <stdlib.h>
    
    int U_P,U_n;
    int login_hour, login_min;
    int date_day, date_mon, date_year;
    int logout_hour, logout_min;
    int date_dayx, date_monx, date_yearx;	
    
    char name[40];
    char Name_Motor[40];
    
    	FILE *CSV,*TEST;
    

    Wenn ich die variabel Name_Motor als String definiere:
    also so:

    string Name_Motor;
    

    Dann bekomme ich ne Endlosschleife als ausgabe 😕

    Das ganze programmiere ich mit MS Visual C++ 2010 Express



  • Stevewonda schrieb:

    @_matze:

    Meintest du es so mit den tags? Hoffe es passt jetzt besser ..

    Ja, passt. 🙂

    Stevewonda schrieb:

    Der Code hier ist mit copy/paste aus meinem Quellcode kopiert.

    was gibt er den bei dri aus?

    Das hier:

    250 600 RM
    500 600 RM

    Oder das was er ausgeben sollte:

    250 500 RM500
    800 750 RM800

    Letzteres. Hierzu habe ich selbst eine Datei geschrieben, in die ich obige Zeilen kopiert habe. Und genau die liest er erwartungsgemäß auch aus.

    Mach mal bitte genau Folgendes:

    - Lege eine neue Datei namens c:\text.txt an.
    - Kopiere deine beiden Zeilen in die Datei.
    - Erstelle ein neues Programm mit folgendem Inhalt:

    int main() {
    	FILE* TEST = fopen("C:\\test.txt", "r");
    	if(NULL == TEST)
    	{
    		printf("Konnte Datei nicht \x94 \bffnen!\n");
    		return 0;
    	}
    	int U_P = -1;
    	int U_n = -1;
    	char Name_Motor[256];
    
    	while((fscanf(TEST,"%d;%d;%s\n", &U_P,&U_n,Name_Motor)) != EOF )
    	{
    		cout << U_P << " " << U_n << " " << Name_Motor << endl;
    	}; 
    }
    

    - Führe das Programm aus.
    - Sag mir nicht, dass hier nicht die Ausgabe kommt, die du gerne hättest! 😉

    Eine Vermutung wäre, dass du aus Versehen die falsche Datei ausliest...



  • Warum diese Mischung aus C und C++?

    Entscheide dich möglichst für eine der beiden Varianten.

    Und, wenn du die überhaupt benötigst:

    #include <windows.h>
    

    einmal reicht auch.

    MfG f.-th.



  • Du brauchst weder windows.h noch den C++ Kram, beispielhaft z.B. vor kurzem:

    http://www.c-plusplus.net/forum/p2061768#2061768

    fscanf ist ziemlich fragil, da es hierbei leicht zu Endlosschleifen kommen kann.



  • Danke für die hilfe habs hinbekommen!!!
    Der DAU hatte mal wieder zugeschagen ^^
    hab baer gemerkt, daß das erzeugen der fiels mit Excel extrem empfindlich ist.

    @f.-th. hab das include file beide male gelöscht; war sinnlos 😃

    Dachte immer jeder C Code ist auch nen C++ cCode der nicht unbedningt elegant ist?
    Und wie unterschiedet man das ?



  • Stevewonda schrieb:

    Dachte immer jeder C Code ist auch nen C++ cCode der nicht unbedningt elegant ist?
    Und wie unterschiedet man das ?

    Meistens gilt das auch (es gibt ein paar Konstrukte wie int* p = malloc(...); , die in C++ nicht legal sind) - umgekehrt gilt das aber nicht.

    PS: Hättest du etwas gewartet, wäre dein erster Beitrag auch in der Gegend gelandet - vermutlich eine Etage tiefer 😉


Anmelden zum Antworten