Abspeichern von Variableninhalten
-
Hallo erstmal,
ich habe folgendes Problem:
Ich habe ein zweidimensionales Feld mit std::Vector erstellt. Nun möchte ich dieses in einer Tabelle abspeichern. Ich habe das schon mit fsrteam versucht. Leider speichert er mir immer nur eine Spalte mit allen Zeilen ab. Die Variableninhalte sollen in einer CSV Datei stehen.
Wie kann ich wenn ein Vector mit 42Zeilen und 10 Spalten in eine CSV Datei ablegen. Ich hoffe jemand kann mir helfen.
-
in dem du deinen vector spaltenweise und dann zeilenweise aus gibst, so als würdest du das lesen wollen auf einen blatt
-
Hast du ein kleines Beispiel dafür?
-
Versuch es doch mal selbst, ist auch nicht so schwer. Tipp: baue 2 ineinander verschachtelte for-Schleifen. Wenns dann immer noch nicht klappt, kannst du ja mal Code posten, und wir sagen dir, was falsch ist. Das ist mit Sicherheit sinnvoller, als immer nur Beispiele zu verlangen.
-
Okay das habe ich gemacht.
Hier mein code:
Ich kann die erste Spalte mit allen Weren in die csv Datei ablegen aber er hat ein Problem mit der zweiten Dimension?
[cpp]
for (long index2=0; index2<(long)my2DVector.size(); ++index2) {datei.open("LMG_Messwerte.csv", ios::app);
datei << my2DVector.at(index2) << endl; //das ist das Problem
datei.close();for (long index=0; index<(long)my1DVector.size(); ++index) {
cout << my1DVector.at(index) << " ";
datei.open("LMG_Messwerte.csv", ios::app);
datei << my1DVector.at(index) << endl;
datei.close();}
}
-
1. Warum öffnest du die Datei und schließt sie jedesmal gleich wieder? Macht das nicht. Öffne sie einmal am Anfang, schreibe was das Zeug hält, und schließe sie am Ende. Alles andere ist unnötig.
2. Du kannst auf einen std::vector mit [] zugreifen. Bastel einfach zwei for-Schleifen und gib dann deine Elemente mit
myFancyVector[row][col]
aus. Das ist ganz einfach. Gut, hier ein ganz einfaches Beispiel (ein 5*5 Array, auf der Konsole ausgegeben):int main() { std::vector<std::vector<int>> myvec (5,std::vector<int>(5)); int k=0,j=0,i=0; //nur zum Füllen des Arrays... for(i=0;i<5;++i) { for(j=0;j<5;++j) { myvec[i][j]=j+k; } k+=j; } //Hier wird ausgegeben. Mach das einfach nach. for(i=0;i<5;++i) { for(j=0;j<5;++j) { std::cout << myvec[i][j] << " "; } std::cout << endl; } }
Gehe mal mit dem Debugger Schritt für Schritt durch und versuche zu verstehen, was in jedem Schritt passiert. Dann baue es für deine Zwecke um.
-
Danke für den Code.
Um aber das ganze in einer csv Datei so darzustellen wie ich das möchte müsste man wahrscheinlich direkt auf die Zellen zugreifen oder?
Die CSV datei bestehen ja wie die XLS datei aus einzelnen Zellen. Egal was ich mache er schreibt mir immer alles in die erste Spalte untereinander.
Also so:Spalte 1 Spalte 2
Zeile 1 1 2
Zeile 2 3 4Und ich möchte:
Spalte 1 Spalte 2
Zeile 1 1 2
Zeile 2 3 4Tut mir leid das ich euch so viel Arbeit mache.
Aber ich weiß nicht weiter.
Wahrscheinlich brauche ich spezielle Bibliotheken dazu. Oder?
-
Danke für den Code.
Um aber das ganze in einer csv Datei so darzustellen wie ich das möchte müsste man wahrscheinlich direkt auf die Zellen zugreifen oder?
Die CSV datei bestehen ja wie die XLS datei aus einzelnen Zellen. Egal was ich mache er schreibt mir immer alles in die erste Spalte untereinander.
Also so:Spalte 1 Spalte 2
Zeile 1 1 2
Zeile 2 3 4Und ich möchte:
Spalte 1__________Spalte 2
Zeile 1 1 __________________2
Zeile 2 3 __________________4Tut mir leid das ich euch so viel Arbeit mache.
Aber ich weiß nicht weiter.
Wahrscheinlich brauche ich spezielle Bibliotheken dazu. Oder?[
-
In2 schrieb:
Um aber das ganze in einer csv Datei so darzustellen wie ich das möchte müsste man wahrscheinlich direkt auf die Zellen zugreifen oder?
Wie, Zellen? Hör mal, in meinem Beispiel greifst du doch direkt auf alle einzelnen Elemente (von mir aus auch Zellen
) zu. Mit
myvec[2][4]
greifst du auf das 5. Element der 3. Zeile zu.In2 schrieb:
Die CSV datei bestehen ja wie die XLS datei aus einzelnen Zellen. Egal was ich mache er schreibt mir immer alles in die erste Spalte untereinander.
Also so:
Spalte 1 Spalte 2
Zeile 1 1 2
Zeile 2 3 4Und ich möchte:
Spalte 1 Spalte 2
Zeile 1 1 2
Zeile 2 3 4Kleiner Tipp: wenn du hier was mit Einrückung zeigen willst, dann nimm z.B. das code-Tag, oder das Courier-Tag. So, wie von dir gepostet, sieht das alles gleich aus.
In CSV-Dateien werden die Daten üblicherweise mit Semikolon oder Komma getrennt (daher auch "Comma-Separated Values"). Du müsstest also einfach hinter jedem Element z.B. ein Semikolon schreiben, und fertig ist die CSV-Datei. Die könnteste dann z.B. auch in Excel öffnen. Ist das dein Ziel? Eine Datei, die du in Excel oder ähnlichen Programmen ansehen oder weiterverarbeiten kannst? Oder willst du etwa eine schön formatierte Datei, die im Editor ganz toll aussieht? Das ist was ganz anderes. Dann müsstest du mit Tabulatoren arbeiten oder auffüllen oder so. Du müsstest am besten noch mal ganz genau formulieren, was der Zweck der Datei ist.In2 schrieb:
Wahrscheinlich brauche ich spezielle Bibliotheken dazu. Oder?
Ähm, nein!
Eine CSV-Datei kriegen wir so grade noch ohne externe Bibliotheken hin.
-
Der Zweck meiner Datei ist, dass jeder Messwert in einer Zelle drinsteht.
So als wenn man diese Zahlen in Excel einfach hineingeschrieben hätte.
Wenn man eine Exceldatei öffnet dann besteht das Tabellenblatt ja aus vielen Zellen (Kästchen). Und wenn ich ein Zweidimensionalen Vector habe mit Beispielsweise 2 Zeilen und 5 Spalten, möchte ich das jede Zahl in einer eigenen Zelle ist.
-
In2 schrieb:
Der Zweck meiner Datei ist, dass jeder Messwert in einer Zelle drinsteht.
So als wenn man diese Zahlen in Excel einfach hineingeschrieben hätte.
Wenn man eine Exceldatei öffnet dann besteht das Tabellenblatt ja aus vielen Zellen (Kästchen). Und wenn ich ein Zweidimensionalen Vector habe mit Beispielsweise 2 Zeilen und 5 Spalten, möchte ich das jede Zahl in einer eigenen Zelle ist.Hm, das beantwortet meine Frage nicht ganz. Mir ist schon klar, wie Werte in Excel aussehen und was da Zellen sind, aber eine Textdatei ist halt was anderes. Da gibt's keine Zellen. Du könntest aber halt eine CSV-Datei erstellen, die in Excel dann auf Zellen aufgeteilt wird. Pass auf, versuchen wir's mal andersrum:
Wärst du damit einverstanden, dass deine Werte in der Datei per Semikolon (Elemente einer Zeile) und Zeilenumbruch (Zeilen) getrennt sind? Das ist der übliche Aufbau einer CSV-Datei. So ist jedes Datum vom anderen abgetrennt, nenne es von mir aus Zelle. So eine Datei kannst du dann auch in Excel öffnen. Jedes Datum wäre dann in einer eigenen Zelle, da Excel mit CSV-Dateien vertraut ist.
Oder willst du, dass die Datei im Notepad ganz toll aussieht, dass die Daten hübsch untereinander stehen und ansprechend eingerückt sind? Dann wird der Aufwand um einiges größer, du fängst an, beim Schreiben in die Datei mit Leerzeichen einzurücken usw. Und außerdem dürftest du dann Probleme bekommen, die Datei mit Excel zu öffnen (die Daten wären dann nicht in einzelnen Zellen, wie du es haben willst).
-
In .XLS und .TXT und .doc geht es.
Ich will sowieso eine Excel Datei haben.
Danke für deine Geduld. In CSV erkennt der einfach keinen Tabulator "\t".
-
In2 schrieb:
In .XLS und .TXT und .doc geht es.
Ich will sowieso eine Excel Datei haben.
Danke für deine Geduld. In CSV erkennt der einfach keinen Tabulator "\t".Ok, du willst was haben, was du in Excel öffnen kannst. Alles klar. Mein Beispiel von vorhin noch mal leicht abgeändert:
for(i=0;i<5;++i) { for(j=0;j<5;++j) { std::cout << myvec[i][j] << ";"; } std::cout << endl; }
So, hier wird jetzt jedes Datum einer Zeile mit einem Semikolon getrennt. Du musst das Beispiel nur noch so abändern, dass nicht mehr auf die Konsole (cout), sondern in eine Datei (fstream) geschrieben wird (und natürlich so, dass deine Variablen benutzt werden und deine Indizes
). Und fertig ist die Excel-kompatible CSV-Datei.
-
Eine CSV öffnet man nicht einfach in Excel wie eine normale xls-Datei.
Gehe über das Menü "Daten" > "Externe Daten" > "Textdatei importieren".
Dort kann man das Trennzeichen "TAB" einstellen.
-
Softwaremaker schrieb:
Eine CSV öffnet man nicht einfach in Excel wie eine normale xls-Datei.
Doch, CSV-Dateien mit Standard-Trennzeichen (z.B. Semikolon) kannst du ganz normal über den Öffnen-Dialog öffnen. Das kennt er dann schon.