Spalten aus CSV-Datei umwandeln und absteigend sortieren
-
FlorianB schrieb:
Wie genau muss ich das machen? Ich hab schon ein bisschen im i-net gestöbert und denke dass ich da ein mehrdimensionales Array verwenden muss. Die wie genau lese ich das aus der Datei in das mehrdimensionale Array ein?
MFG Floversuchs mal mit nem std::vector<std::vectorstd::string >, das nimmt dir die Speicherverwaltung ab und ist deshalb deutlich leichter zu handeln als ein mehrdimensionales C-Array. Mit typedef wirds noch einfacher zu lesen:
typedef std::string CSVCell; typedef std::vector<CSVCell> CSVRow; typedef std::vector<CSVRow> CSVContent;
(Column bedeutet Spalte, ich hab deinen Code jetzt nur überflogen, behaupte aber mal dass "column_number" eigentlich "row_number" heißen sollte.)
Einlesen einer ganzen CSV-Datei würd ich dann in etwa wie folgt machen:
CSVContent readCSV(istream& is); CSVRow parseCSVRow(std::string const& line); CSVContent readCSV(istream& is) { CSVContent content; std::string line; while (std::getline(is, line)) { CSVRow row = parseCSVRow(line); content.push_back(row); } return content; } CSVRow parseCSVRow(std::string const& line) { CSVRow row; CSVCell cell; std::istringstream lineStream(line); while (std::getline(lineStream, cell, ';')) { row.push_back(cell); } return row; }
Anmerkungen zu deinem Code:
- <time.h> ist kein C++. Du meinst <ctime>
- dec2bin raucht dir gandenlos ab, wenn decimal > 2^80 (es steht nirgendwo, dass ein long nur 64 bit haben kann, es könnte durchaus 128 bit haben)
- Leerzeilen im Code sind keine Schande und machen den Code leserlicher - vor allem zwischen Funktionsblöcken.
- du kannst streams gleich den Dateinamen als parameter mitgeben, dadurch erübrigt sich der Aufruf von open()
- warum printf in Zeile 104? solltest du nicht mit cout mischen, ist außerdem nicht Typsicher und in den Formatflags anfällig für Tippfehler.
- das Schlüsselwort "struct" in Zeile 98 ist in C++ überflüssig.
- allgemein sieht der Abschnitt Zeile 98-104 so aus, als hättest du ihn irgendwo per copy&paste aus einem C-Code hergeholt, ohne wirklich nachzuvollziehen was da genau gemacht wird.
- Zeile 110: das if...else break gehört in die Schleifenbedingung, dazu gibts die.
- Variablendeklarationen (z.B. loo_counter) sollten möglichst nah an der Stelle erfolgen, wo die Variable auch gebraucht wird. Die Variablen so wie du es machst ganz am Anfang der Funktion zu definieren ist in C++ nicht nötig und schlechter Stil
- sscanf: hier gelten ähnliche Dinge wie für printf. Benutze C++-Streams und Strings, wenn es keine wirklich guten Gründe gibt, auf die alten C-Funktionen auszuweichen (die gibts hier nicht)
- Zeile 230ff., 247ff. sind eine Wiederholung von zeile 98ff. Erstens spricht nichts dagegen, die Variablen von dort wieder zu verwenden, zweitens sollte man Code nicht per copy&paste doppelt schreiben, sondern in so einem Fall in eine eigene Funktion auslagern.
- die Zeilennummer köntnest du in ein int konvertieren, dann wird aus dem lästigen else if else if... eine etwas elegantere switch/case Kaskade
- goto ist pfui, aus verschiedensten Gründen (die man alle im Netz nachlesen kann). Es gibt zig andere Möglichkeiten, so etwas zu lösen
- deine main() ist elend lang, du hast kaum etwas in Funtkionen ausgelagert. Das ist schlecht lesbar und deshalb kein besonders guter Stil. Daran solltest du noch arbeiten.
-
endlich redet mal einer deutsch mit mir
THX
an typedef bin ich grad drann...
column_number = Die Nummer die in der CSV-Datei steht vor dem restlichen Inhalt der Zeile. Also praktisch die Zeilenangabe.
Deinen Code zum Einlesen der CSV-Datei versteh ich noch nicht ganz. Kannst du mir den eventuell noch genauer erklären.
Ich würde jetzt gern 10.005 Zeilen einlesen, aus der CSV-Datei. Die fünf sind die, die Umgewandelt werden müssen. Bei den anderen 10.000 würde ich gern immer 20 Stück aufeinmal einlesen. Dann umwandeln. Heißt also bei 10.005 Zeilen, a 20 stück und einmal 5, ergiebt 1501 Durchläufe des Programms.nun zu den Anmerkungen:
<ctime> hab ich geändert, danke vor den Hinweis
zu dec2bin: meinst du damit, dass wenn ich größere Zahlen als 2^80 eingeben funktionierts nicht mehr? es werden sowiso nur kleinere Zahlen eingelesen.
ich werd mich daran halten, Leerzeilen zu verwenden
ich habs auch schon so: ifstream input("input.csv"); probiert hat aber leider nicht funktioniert. Wenn ich nur fünf Zeilen einlese, hat er mir 15 ausgegeben. Ich werd es vorerst mal so lassen.
zu Zeile 98 bis 104: du hast mich ertappt, ich hab die Funktion aus dem i-net kopiert. Wollte damit nur die Zeit messen, was auch ohne probleme geklappt hat. Die Funktion wird im eigentlichen Programm aber wieder gelöscht.
zu Variablendeklarationen: ok werd mich daran halten
zu sscanf: das liegt mir auch noch auf dem Herzen. Wie kann ich das in eine Schleife verpacken? bzw. in streams?
sscanf(column_content_in_char, "%i;%i;%i;%i;%i;%i;%i;%i;%i;%i;%i", &array_number[0], &array_number[1], &array_number[2], &array_number[3], &array_number[4], &array_number[5], &array_number[6], &array_number[7], &array_number[8], &array_number[9], &array_number[10]);
zu Zeile Zeile 230ff., 247ff: wie schon gesagt, das war nur für einen kurzen Zeitmessungstest. Aber du hast recht, dass ich das in eine Funktion auslagen sollte.
zu den else if else if: werd ich mal probieren, dass ich das mit switch hinbekommen. Is ja ansich nicht schwer.
zu goto: hat man mir auch schon gesagt. Deshalb hab ich ja den unteren (neueren) Code ohne goto geschrieben.
Dass meine main() so lang ist hängt hauptsächlich mit der Funktion zum Zeitmessen zusammen, die ja wieder gelöscht wird.
zu: Daran solltest du noch arbeiten. : Der Mensch ist zum lernen da und dass werd ich auch machen.
vielen vielen dank nochmal. ich dachte schon dass mich hier jeder ignoriert.
MfG Flo
-
FlorianB schrieb:
an typedef bin ich grad drann...
Gut. Kurz gesagt ist das nur eine Möglichkeit, einem (meist komplexen) Typen einen anderen (lesbaren, verständlichen) Namen zu verpassen. Siehe dazu später.
column_number = Die Nummer die in der CSV-Datei steht vor dem restlichen Inhalt der Zeile. Also praktisch die Zeilenangabe.
Eben. Column heißt aber nicht Zeile, sondern Spalte. Und das ist grade in einem CSV was völlig anderes. Du hast für deine Zeilennummern also eine Variable namens "spalten_nummer". Sehr verwirrend
Deinen Code zum Einlesen der CSV-Datei versteh ich noch nicht ganz. Kannst du mir den eventuell noch genauer erklären.
Okay, mit Kommentaren:
/** der "Typ" CSVCell soll, wie der Name schon sagt * den Inhalt einer Zelle aus der CSV-Datei darstellen. * Ist das Selbe wie ein std:.string **/ typedef std::string CSVCell; /** der "Typ" CSVRow soll den Inhalt einer Zeile * aus der CSV-Datei darstellen. Eine Zeile besteht * aus mehreren Zellen, also bietet sich ein vector * aus Zellen an. **/ typedef std::vector<CSVCell> CSVRow; /** der "Typ" CSVContent soll den Inhalt mehrerer * Zeilen aus der CSV-Datei darstellen. also bietet * sich ein vector aus Zeilen, d.h. ein vector aus * CSVRow an. Aufgelöst ist das ein * std::vector<std::vector<std::string> > **/ typedef std::vector<CSVRow> CSVContent; /** Ich habe zwei Funktionen: * Nr 1 liest den Inhalt eines beliebigen istreams * (der in CSV-Manier formatiert ist) * und liefert die Inhalte aller Zellen in * einem Objekt des oben definierten Typs CSVContent **/ CSVContent readCSV(istream& is); /** Nr 2 * Nimmt eine Zeile (string) aus dem input-Stream * Und liefert eine CSVRow, d.h. einen vector aus * Zellen zurück **/ CSVRow parseCSVRow(std::string const& line); // Implementierung von Funktion Nr1 CSVContent readCSV(istream& is) { CSVContent content; //hier kommen die ganzen CSV-Zeilen (und damit alle Zellen) rein std::string line; //lies jeweils eine Zeile aus dem Stream und speichere sie in line while (std::getline(is, line)) { //verwandle die Zeile aus dem Stream mittels Funktion Nr 2 in eine CSV-Zeile CSVRow row = parseCSVRow(line); //Hänge die CSV-Zeile an den restlichen ausgelesenen CSV-Inhalt content.push_back(row); } //Die Schleife ist zu Ende, d.h. die Datei komplett ausgelesen //also den ermittelten CSV-Inhalt zurückgeben return content; } //Implementierung Funktion Nr2 CSVRow parseCSVRow(std::string const& line) { //eine leere CSV-Zeile (leerer vector<CSVCell>) CSVRow row; CSVCell cell; //packe die "rohe" Zeile aus der Datei in einen Stringstream std::istringstream lineStream(line); //hole jeden Zelleninhalt einzeln aus der rohen Zeile... while (std::getline(lineStream, cell, ';')) { //... und füge ihn als neue Zelle an die CSV-Zeile an row.push_back(cell); } //die ganze "Rohzeile" wurde ausgelesen -> CSV-Zeile zurückgeben return row; }
zu dec2bin: meinst du damit, dass wenn ich größere Zahlen als 2^80 eingeben funktionierts nicht mehr?
"Funktioniert nicht mehr" kann vieles bedeuten. Hier greift die schlimmste Variante von "funktioniert nicht": Undefiniertes verhalten, vermutlich ein Absturz durch einen Zugriffsfehler.
Bei Zahlen der Größe 2^80 stopfst du mehr als 80 Nullen und Einsen in deinen internen Puffer in der Funktion, und da du das nicht abfragst, schreibst du über dessen Ende hinaus.ich habs auch schon so: ifstream input("input.csv"); probiert hat aber leider nicht funktioniert.
ifstream input; input.open("input.csv",ios::in); //ist das Selbe wie ifstream input("input.csv",ios::in);
http://www.cplusplus.com/reference/iostream/ifstream/ifstream/
Wenn du da andere Ausgaben bekommen hast, liegts an was anderem.zu sscanf: das liegt mir auch noch auf dem Herzen. Wie kann ich das in eine Schleife verpacken? bzw. in streams?
sscanf(column_content_in_char, "%i;%i;%i;%i;%i;%i;%i;%i;%i;%i;%i", &array_number[0], &array_number[1], &array_number[2], &array_number[3], &array_number[4], &array_number[5], &array_number[6], &array_number[7], &array_number[8], &array_number[9], &array_number[10]);
Schau dir mal stringstreams an. Vorgehen in dem Fall:
- leerer ostrignstream
- in einer Schleife die Nummern, jeweils gefolgt von einem ';' in den Stream
- string aus dem stringstream holen.
zu goto: hat man mir auch schon gesagt. Deshalb hab ich ja den unteren (neueren) Code ohne goto geschrieben.
Ja, stattdessen hast du exit benutz. Ist auch nicht so prickelnd, da beim Aufruf von exit das Programm sofort ohne Umschweife (d.h. z.B. ohne Destruktor aufrufe) abgebrochen wird. Du lässt quasi alles stehn und liegen und jemand anderes (Das Betriebssystem) darf deinen Dreck wegräumen
Dass meine main() so lang ist hängt hauptsächlich mit der Funktion zum Zeitmessen zusammen, die ja wieder gelöscht wird.
Nein. Das hängt damit zusammen, dass du alles nacheinander in der Main abarbeitest. Wenn du in wenigen Stichpunkten beschreiben sollst, was dein Programm macht, sieht das doch in etwa so aus:
- Information zum programm ausgeben und Zeilenzahl eingeben lassen
- Wenn die Datei nicht geöffnet werden konnte Feierabend
- Sonst:
- Konvertierungsinfos in outputDatei ausgeben
- Schleife über alle Zeilen: <mache irgendwas mit der Zeile>
Dementsprechend sollte/könnte deine main() aussehen:
int main() { outputProgramInfo(); int number_of_input_rows = readRowNumber(); fstream output("output.csv",ios::out); ifstream input("input.csv",ios::in); //bei dir fehlt uebrigens die ueberpruefung, ob output geoeffnet wurde if (checkIfAllFilesOpen(input, output)) { CSVContent = readCSV(input); input.close(); //brauchen wir nicht mehr processCSVContent(CSVContent, output); } }
Was da passiert sollte schon aus dem Quellcode schnell zu sehen sein - was in die einzelnen Funktionen reinkommt sei dir überlassen
(Natürlich sollten auch die nicht wieder zu so Mammutfunktionen ausarten)zu: Daran solltest du noch arbeiten. : Der Mensch ist zum lernen da und dass werd ich auch machen.
Gute Einstellung
-
vielen dank für die Erklärungen.
zu spalten_nummer du hast recht, ich hab mich mit dem Namen vertan. Schon geändert
zu dec2bin: ich werd die Funktion vorerst mal so lassen, da ja sowiso nur kleinere Zahlen eingelesen werden.
zu ifstream input: ja ok so funktioniert es einwandfrei. hab nur das ",ios::in" vergessen
zu sscanf: ok jetzt hab ich es soweit, dass ich den Zeileninhalt in dem ostringstream habe, nur wie bring ich den ihn die einzelnen arrays (is glaub ich am besten zu Weiterbearbeitung)
zu goto: irgendetwas muss das Bertiebssystem ja machen :D:D wie kann ich es besser machen? Funktioniert so eigentlich ganz gut.
meine main() hab ich jetzt aus 25 Zeilen gekürzt (mit auslagern in Funktionen). Die wird aber noch weiter gekürzt wenn ich die Zeitmessung raus nehme. Jetzt sind es insgesamt fünf Funktionen + Main() + Deklarationen.
Gruß Flo
-
Hallo Leute,
nun bin ich soweit, dass ich die Main etc gekürzt hab.
Ich komme jedoch immernoch nicht kla, ab der fünften Zeile, 20 Zeilen auf einmal in ein Array einzulesen. Dass ich die ersten fünf Zeilen einlese umwandle und zwischenspeicher geht ohne probleme.
Wie muss ich das machen?
MfG Flo
-
Hallo Leute,
keiner mehr da?
MfG Flo
-
Du müsstest schon deinen Code posten, damit man dir helfen kann. Ich glaube niemand hat eine so mächtige Glaskugel.
-
Schade wer doch mal was schönes so ne Glaskugel
Nun der Code:
#include <string> #include <iostream> #include <conio.h> #include <fstream> #include <ctime> #include <strstream> #include <sys/timeb.h> #include <sstream> using namespace std; ifstream input("input.csv",ios::in); fstream output("output.csv",ios::out); int number_of_input_lines; string line_content = "0", line_number = "0"; // Column number and the rest of the column content int loop_counter = 0; // variable to input the number of the convert figures, loop counter const int inputs_per_line = 7; // number of inputs per column const int max_line_number = 31750; // number of column inputs string line_output[max_line_number]; // to the descending output of the columns int array_number[inputs_per_line]; int array_anzahl = sizeof(array_number) / sizeof(array_number[array_anzahl]); int int_line_number; void dec2bin(long decimal, char *binary) // decimal-to-binary conversion { int k = 0, n = 0; int neg_flag = 0; int remain; int old_decimal; char temp[80]; if (decimal < 0) { decimal = -decimal; neg_flag = 1; } do { old_decimal = decimal; remain = decimal % 2; decimal = decimal / 2; temp[k++] = remain + '0'; } while (decimal > 0); if (neg_flag) { temp[k++] = '-'; } else { temp[k++] = ' '; } while (k >= 0) binary[n++] = temp[--k]; binary[n-1] = 0; } string number2roman(int x) // Decimal to Roman numerals conversion { if(x < 1 || x > 1000000000000) throw(x); static const char *rom_strings[] = { "M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I" }; static const int rom_values[] = { 1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1 }; string rest; for(int i = 0; x != 0; ++i) while(x >= rom_values[i]) { x -= rom_values[i]; rest += rom_strings[i]; } return rest; } int output_program_info() { cout << "Please save the \"input.csv\" file in the same folder \nin which also the CSV-File Reader is existing. \n" << "The column numbers in column 1 to 9 must be written \nlike this in the CSV-File: 01 ... 09. \n" << "The 0 is needed for the converter. \nHow many column must be converted? "; cin >> number_of_input_lines; // input of the column number cout << "\nPress any key to start the conversion ...\n"; getch(); cout << "Conversion is in process...\n"; output << ";;*** CSV File Reader ***\n\n Info:\n"; if (input.is_open() && output.is_open()) { output << " - Input file has been founded and now it is available! \n" << " - First conversion: decimal. \n - Second conversion: octal. \n" << " - Third conversion: hexadecimal. \n - Fourth conversion: binary. \n" << " - Fifth conversion: symbolic. \n" << " - A reference for the fifth column: Only write number not higher than 60.000. Later it's easier to read. \n" << " - All columns get mirrored from to beginning to the end or rather from the end to the beginning. \n\n" << "Column Number: ;Numbers: \n"; } else { output << "Error. No input file."; exit; } return number_of_input_lines; } void timekeeping() { struct _timeb timebuffer1; char *timeline1; _ftime( &timebuffer1 ); timeline1 = ctime( & ( timebuffer1.time ) ); printf( "\t\t\t\t\t\ %.19s.%hu %s", timeline1, timebuffer1.millitm, &timeline1[20] ); } string conversion() { do { if (loop_counter != number_of_input_lines) { getline(input, line_number, ';'); getline(input, line_content); if (line_number <= "05" ) { bool d = line_content.find_first_of("abcdefghijklmnopqrstuvwxyzABCDEFGHIKLMNOPQRSTUVWXYZ") == string::npos; // error control of data if (d != 1) { output << "You made a wrong input in column number " << line_number << ". Fill in only numbers,please." << endl; break; } else { const char *line_content_in_char = line_content.c_str(); sscanf(line_content_in_char, "%i;%i;%i;%i;%i;%i;%i", &array_number[0], &array_number[1], &array_number[2], &array_number[3], &array_number[4], &array_number[5], &array_number[6]); int_line_number = atoi( line_number.c_str() ); { switch(int_line_number) { case 1: { // Conversion line 1 line_output[0] = line_number + ";" + line_content; } case 2: { // Conversion line 2 string line_number02, line_content_02; char content[20]; line_number02 = line_number + ";"; if (array_number[0] == 0) { line_content_02 = "Nothing for outputting!"; } else { for (int i=0; i<array_anzahl; i++) { sprintf(content,"%1o",array_number[i]); line_content_02 = line_content_02 + content + ";"; } } line_output[1] = line_number02 + line_content_02; } case 3: { // Conversion line 3 string line_number03, line_content03; char content[20]; line_number03 = line_number + ";"; if (array_number[0] == 0) { line_content03 = "Nothing for outputting!"; } else { for (int i=0; i<array_anzahl; i++) { sprintf(content,"%1x",array_number[i]); line_content03 = line_content03 + content + ";"; } } line_output[2] = line_number03 + line_content03; } case 4: { // Conversion line 4 char binary[80]; string line_number04, line_content_04, content; line_number04 = line_number + ";"; if (array_number[0] == 0) { line_content_04 = "Nothing for outputting!"; } else { for (int i=0; i<array_anzahl; i++) { dec2bin(array_number[i],binary); content = binary; line_content_04 = line_content_04 + content + ";"; } } line_output[3] = line_number04 + line_content_04; } case 5: { // Conversion line 5 long symbol = 0; string line_number05, line_content_05, content; line_number05 = line_number + ";"; if (array_number[0] == 0) { line_content_05 = "Nothing for outputting!"; } else { for (int i=0; i<array_anzahl; i++) { content = number2roman(array_number[i]) + ";"; line_content_05 = line_content_05 + content; } } line_output[4] = line_number05 + line_content_05; } } } } ++loop_counter; // loop counter for column one two five } else { line_output[loop_counter] = line_number + ";" + line_content; ++loop_counter; // loop counter for the rest of the columns do { getline(input, line_number, ';'); getline(input, line_content); line_output[loop_counter] = line_number + ";" + line_content; ++loop_counter; // loop counter for the rest of the columns } while (loop_counter != number_of_input_lines); } } else { break; } } while (!input.eof()); return line_output[0], line_output[1], line_output[2], line_output[3], line_output[4], line_output[loop_counter]; } int main() // Main program { output_program_info(); timekeeping(); conversion(); timekeeping(); for (int i = number_of_input_lines-1; i>=0; i--) // Mirroring and output { output << line_output[i] << endl; } timekeeping(); output.close(); cout << "Conversion successful.\n\nOpening output file ...\nClose the output file to exit\n"; system("output.csv"); timekeeping(); getch(); }
Gruß Flo
-
Hey,
is noch jemand da?
MfG Flo
-
FlorianB schrieb:
Hey,
is noch jemand da?Hallo Flo,
ja es sind noch viele da, aber bis jetzt hat Dir niemand geantwortet.
Du hast immer noch eine ganze Menge Code (286 Zeilen), die mühsam zu lesen sind, und Deine Frage oben wurde von pumuckl bereits beantwortet.pumuckl schrieb:
FlorianB schrieb:
zu sscanf: das liegt mir auch noch auf dem Herzen. Wie kann ich das in eine Schleife verpacken? bzw. in streams?
sscanf(column_content_in_char, "%i;%i;%i;%i;%i;%i;%i;%i;%i;%i;%i", &array_number[0], &array_number[1], &array_number[2], &array_number[3], &array_number[4], &array_number[5], &array_number[6], &array_number[7], &array_number[8], &array_number[9], &array_number[10]);
Schau dir mal stringstreams an. Vorgehen in dem Fall:
- leerer ostrignstream
- in einer Schleife die Nummern, jeweils gefolgt von einem ';' in den Stream
- string aus dem stringstream holen.
dazu hast Du noch keine Stellung genommen ..
Zerlege Dein Problem doch mal in kleine Häppchen und löse sie eines nach dem anderen.
Anbei mal ein kleines Programm zum Üben des Lesens aus einer csv-Datei:
#include <fstream> #include <iostream> std::istream& semikolon( std::istream& in ) { char semikolon; if( in >> semikolon && semikolon != ';' ) in.setstate( std::ios_base::failbit ); return in; } int main() { using namespace std; const int anzahlSpalten = 20; ifstream input("input.csv"); // kein 'ios::in' das macht der ifstream schon for( int zeile = 0; input; ++zeile ) { int number; for( int spalte = 0; input >> number; ) { cout << "array_number[" << spalte << "] = " << number << "; "; if( ++spalte < anzahlSpalten ) input >> semikolon; else break; } cout << endl; } return 0; }
Du bekommst eher eine Antwort, wenn Du kleine Menge Code postest (ca. ein Dutzend Zeilen) und konkrete Fragen dazu stellst.
Gruß
Werner
-
Hey Leute,
inzwischen hab ich es alleine geschaft.
Das einizge was jetzt noch fehlt, ist das hier:sscanf(column_content_in_char, "%i;%i;%i;%i;%i;%i;%i;%i;%i;%i;%i", &array_number[0], &array_number[1], &array_number[2], &array_number[3], &array_number[4], &array_number[5], &array_number[6], &array_number[7], &array_number[8], &array_number[9], &array_number[10]);
Damit komm ich noch nicht klar. Ich habe mich sehr lange mit stringstreams beschätigt, komme aber dennoch nicht so ganz klar.
Wie muss ich das in C++ machen?
Mfg Flo
-
for(int i = 0; i < 11; ++i) std::cin >> array[i];
-
FlorianB schrieb:
Wie muss ich das in C++ machen?
Hallo Flo,
so wie es hier steht.
314159265358979 schrieb:
for(int i = 0; i < 11; ++i) std::cin >> array[i];
Du hast die ';' in sscanf(column_content_in_char, "%i;%i;%i;%i;%i;%i;%i;%i;%i;%i;%i", .. übersehen
-
Da hast du Recht, sorry.
-
Schau dir mal stringstreams an. Vorgehen in dem Fall:
- leerer ostrignstream
- in einer Schleife die Nummern, jeweils gefolgt von einem ';' in den Stream
- string aus dem stringstream holen.
Also 1:
#include <sstream>
...
in der main:ostringstream content_from_line;
2:
for(int i = 0; i < 11; ++i)
{
content_from_line << line_content_in_char + ";";
}3:
Wie mach ich das?
Zu zwei noch: warum eigentlich die Nummern gefolgt von einem Komma? In line_content_in_char steht zum Beispiel 85;45;26;496;314; drin! Da muss ich doch nicht noch Kommas einfügen! Das macht doch schon die CSV Datei bzw das wird schon mit Kommas ausgelesen.
Das versteh ich nicht ganz.
MfG Flo
-
FlorianB schrieb:
pumuckl schrieb:
Schau dir mal stringstreams an. Vorgehen in dem Fall:
- leerer ostrignstream
- in einer Schleife die Nummern, jeweils gefolgt von einem ';' in den Stream
- string aus dem stringstream holen.
[...]
Das versteh ich nicht ganz.
Hallo Flo,
darauf sollte Dir besser pumuckl selbst antworten.
FlorianB schrieb:
Das einizge was jetzt noch fehlt, ist das hier:
sscanf(column_content_in_char, "%i;%i;%i;%i;%i;%i;%i;%i;%i;%i;%i", &array_number[0], &array_number[1], &array_number[2], &array_number[3], &array_number[4], &array_number[5], &array_number[6], &array_number[7], &array_number[8], &array_number[9], &array_number[10]);
[...]
Wie muss ich das in C++ machen?auf diese Frage präzisiere ich meine Antwort von vorhin [12:18:51 09.03.2011]: das Code-Segment in meinem Beitrag in den Zeilen 19-27 zeigt, wie man das in C++ machen kann (nicht muss). Wobei Du in Zeile 22 den Wert von 'number' in einem Array/Container unter dem Index 'spalte' abspeichern kannst.
Gruß
Werner