C++ CSV auslesen und werte in ein Feld speichern

Chakky

Member of Honour
Hi,

kämpfe mittlerweile schon paar Stunden an einer scheinbaren einfacher Aufgabe.

Ich hab folgende CSV Datei
Code:
1.6;2;3;4;5;
6;7;8;9;10;
11;12;13;14;15;
Die "1.6" ist absicht.

Und will das ganze mit einen C++ Programm auslesen und jeden wert in der CSV in einen Array abspeichern. Das ich dann einfach nur noch zugreifen kann mit Array[ZEILE][SPALTE].

Nach vielen Foren durchwühlen und Referenzen lesen habe ich bis jetzt folgendes hinbekommen:
Code:
#include <fstream>
#include <iostream>
#include <iomanip>
#include <sstream>
#include <string>

 
using namespace std;
 
int main()
{
    string zeile;
    float a, f[6][6];
	float b;
    char c;
	int i=0;
	int j=0;
	
 
    ifstream input("123456.csv",ios::in);
 
    if (input.is_open())
    {
        while (getline(input, zeile)) 
        {
         //  cout<<zeile; //testausgaeb
			istringstream istr (zeile);//Pointer??
				
		
			for(i=0;i<5;i++)
				for(j=0;j<5;j++){
				if (istr >> a && istr >> c && c == ';') //zum trennen
							 {
								cout << "a: " << a <<endl;
								f[i][j]=a;

								//i++;
							//	j++;
			
				}}
					
			    
			cout<<"\n";
	}
 
    }
    else
    {
        cout << "Dateifehler oder Datei nicht gefunden!" << endl;
    }
	cout<< f[2][3];
	
	
 system("PAUSE");
    return 0;
}

Als Ausgabe bekomme ich folgendes:
Code:
a: 1.6
a: 2
a: 3
a: 4
a: 5

a: 6
a: 7
a: 8
a: 9
a: 10

a: 11
a: 12
a: 13
a: 14
a: 15

-1.07374e+008Drücken Sie eine beliebige Taste . . .

Wie man sieht fein säuberlich alle Werte getrennt nur der Letzte Wert passt überhaupt nicht (sieht für mich aus wie irgendein Wert aus den Speicher) nur Warum?

Ich weis der Programmierstil ist nicht der beste es soll einfach nur Funktionieren, da dies die Grundlage ist in ein anderes Funktionierendes System zu integrieren....

Das ganze Teste ich unter Win7 64Bit und Visual Studio 2010 Premium.
 
Das war ja mal richtig tückisch. Kurz zusammengefasst: Du hast alles in die erste Zeile des Arrays geschrieben, weil du deine while-Schleife außen herum um die verschachtelten for-Schleifen hattest. Aber der Code erklärt das wahrscheinlich besser, rhetorisch bin ich nicht so der Held :P:
Code:
#include <fstream>
#include <iostream>
#include <iomanip>
#include <sstream>
#include <string>
 
using namespace std;
 
int main()
{
  string zeile;
  float value, valueArray[5][5];
  float b;
  char separator;      

  ifstream input("123456.csv",ios::in);

  if (!input.is_open())
  {
    cout << "Dateifehler oder Datei nicht gefunden!" << endl;
    return 1;
  }
  
  for(int i = 0; i < 5; i++)
  {
    if (!getline(input, zeile))
      continue;
    
    istringstream istr (zeile);      

    for(int j = 0; j < 5; j++)
    {
      istr >> value;
      istr >> separator;
      
      if (istr.fail())
      {
	istr.clear();
	continue;
      }
      
      if (separator == ';')
      {
	valueArray[i][j] = value;
	cout << "(" << i << "," << j << ") = " << value << endl;
      }	  
    }
  }		    
    
  cout << endl;
      
  cout << valueArray[2][3] << endl;   
      
  return 0;
}

mfg benediktibk

Edith sagt: Es gibt auf dieser Welt keinen Grund mit dem Stil zu schlampen, wenn man nicht die Zeit hat lesbaren Code zu schreiben sollte man es besser lassen. Oder würdest du ein Buch schreiben das keiner lesen kann? Wäre doch herzlich sinnlos.
 
Zuletzt bearbeitet:
So ich hab es u.a. mit Hilfe aus der Chatbox hinbekommen und so jetzt gelöst

Code:
#include <iostream>
#include <sstream>
#include <fstream>
#include <vector>
#include <string>

using namespace std;

int main ()
{
	float f[5][5];//feld
	float t; //zwischenspeichervariabel
	
    ifstream inFile ("123456.csv"); //datei öffnen
    string line; //zeilen als string behandeln
    int linenum = 0; //zeilennummer 
    while (getline (inFile, line)) //jede zeile abfragen
    {
        linenum++; //zeile auf 1 erhöhen um besser zählen zu können
        cout << "\nLine #" << linenum << ":" << endl; //zeilennummer ausgeben
        istringstream linestream(line); //irgendwaswandeln
        string item; //item anlegen vorerst als string
		
        int itemnum = 0; //itemnummer speichern
        while (getline (linestream, item, ';')) //jedezeile durchsuchen nach trennzeichen und gefunden im item speichern
        {
            
			itemnum++; //itemnummer hochzählen 
			
            cout << "Item #" << itemnum << ": " << item << endl; //ausgabe
			stringstream sstr; //für umwandlung
			sstr<<item; //item als string in den stream schicken
			sstr>>t; //stream in float umwandeln
			f[linenum][itemnum]=t; //imfeld speichern
        }
    }
	cout<<f[1][3];
	system("PAUSE");
    return 0;
}

Die Lösung von dir benediktibk werde ich auch ausprobieren und schauen was besser läuft. Vielen Dank dir natürlich auch das du sogar eine kurze Fehleranalyse gemacht hast!

Zum Thema Stil: Da das Programm wohl nie wieder nach der getanen Arbeit gebraucht wird, wird halt etwas geschlampt im aussehen :)
 
Zurück
Oben