CSV einlesen und Zeichen ersetzen [Anfänger]

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • CSV einlesen und Zeichen ersetzen [Anfänger]

    Hallo liebe Community,

    dieses ist mein erster Beitrag und obwohl ich meine, das Internet ist die größte Bücherei der Welt und GOOGLE zeigt mir die Richtung, stehe ich nun wirklich auf dem Schlauch. Der Kopf raucht schon (OK, ich bin auch Raucher).

    Ich beschäftige mich seit nunmehr seit ein paar Tagen mit C bzw. C++. Dazu muss ich sagen, das ich bereits des öfteren mal kleine Windoof- Anwendungen in Visual Basic geschrieben habe und auch fundamentierte Kenntnisse zu php und MySQL besitze. Auch in Perl (CGI) kann ich ein wenig was erreichen. Doch irgendwie kann ich nicht wirklich was mit diesen Kenntnissen jetzt anfangen.
    Das Projekt, welches ich nun in C/C++ umsetzen wollte, stammt ursprünglich aus einem Perl- Script, welches ich vor ca. einem halben Jahr mal geschrieben habe. Aufgrund der bis heute angesammelten Datenmengen ist jedoch Perl nicht mehr das ware, da es den Server so stark ausbremmst, das alles andere ins Wanken kommt. Warum C/C++? Es ist ein Server mit LinuxUmgebung und da hielt ich C/C++ für das anständigste, zumal es später entweder als eigenständiger Daemon oder halt eben per Crontab gestartet werden soll.

    Mit Hilfe des Internets habe ich herausgefunden, wie ich eine CSV Datei öffne und diese auch Zeilenweise einlesen kann. Die Daten werden per ";" getrennt und in einem Vector abgelegt.

    Quellcode

    1. std::vector<std::string> tokenize(const std::string& str, char delim)
    2. {
    3. std::vector<std::string> tokens;
    4. std::stringstream mySstrema(str);
    5. std::string temp;
    6. while(getline(mySstrema, temp, delim))
    7. tokens.push_back(temp);
    8. return tokens;
    9. }
    10. int main () {
    11. ifstream fin("datei.csv");
    12. string buffer;
    13. float netto;
    14. int bestand;
    15. char* artikelnr, artikelname, hersteller, herstellerartnr, ean, gruppe, status, content, werbung;
    16. while (fin.good()) {
    17. getline(fin,buffer,'\n');
    18. std::vector<std::string> myTokens;
    19. myTokens = tokenize(buffer, ';');
    20. if (myTokens[0] == "Artikel-Nummer")
    21. continue;
    22. for (size_t i = 0; i < myTokens.size(); ++i)
    23. {
    24. if (i == 8)
    25. {
    26. char *content = new char[myTokens[i].size()+1];
    27. strcpy(content, myTokens[i].c_str());
    28. replace(content.begin(), content.end(), "\r\n", "<br>"); //<--- Fehler beim compilieren
    29. }
    30. cout << "Artikel-Nummer: " << myTokens[0] << " -CONTENT-> " << content << endl; //<---- Zwar kein Fehler, aber content ist leer, bzw. erhalte ein Æ als Ausgabe.
    31. }
    32. }
    33. fin.close();
    34. }
    Alles anzeigen


    Mein Problem könnt ihr vielleicht schon so sehen. Ich möchte Zeichen im content ersetzen. Jedoch bricht der Compiler an dieser Stelle mit einer Fehlermeldung ab:

    Quellcode

    1. Fehler: Abfrage des Elementes »begin« in »content«, das vom Nicht-Klassentyp »char*« ist
    2. Fehler: Abfrage des Elementes »end« in »content«, das vom Nicht-Klassentyp »char*« ist


    Auch Versuche mit replace direkt nach dem einlesen der Zeile aus der CSV sind daneben gegangen.

    Im weiteren habe ich gelesen, das Variablen in Functionen und Schleifen nur in der selben Ihre Gültigkeit behalten. Wenn ich also nun auf einen Wert einer Variable außerhalb einer Schleife zugreifen will, habe ich die A...Karte. Wie kann ich diese Variable Global nach außen verfügbar machen?

    Ich möchte innerhalb der While Schleife weitere Daten auswerten, ggfl. korrigieren und in einer der als char*, float oder int deklarierten Variable verfügbar machen. Diese sollen später ein Update eines Shopsystems (Huhu, da bin ich dann wieder bei PHP und MySQL *lol*) die Datenbank aktualisieren. Für das Datenbankupdate habe ich zwar auch schon ein wenig Code, aber das bringt mir eher wenig, solange ich das Auswerten und korrigieren der CSV nicht richtig hinbekomme.


    Ich habe hier aus diesem Forum nun auch schon einiges gelesen und bin dadurch teilweise etwas schlauer geworden. Nur leider hat nichts davon zur Lösung meines Problems beigetragen. (Oder ich habe das Posting vor lauter Themen nicht gesehen).

    Für eure Bemühungen, Verbesserungsvorschläge oder auch Kritiken wäre ich dankbar. Aber bitte vergesst eines nicht, C/C++ ist für mich absolutes Neuland.

    Grüße, CoPyMaus

  • Folgendes hast du sicher schon gelesen:
    cplusplus.com/reference/algorithm/replace/

    MfG bcc-fan


    Danke für deine Hilfe bcc-fan.

    Doch irgendwie bin ich entweder zu blöd oder ich begreife es nicht so wirklich. Über diese Seite bin ich vorher auch schon gestoßen.

    Zu dem Link zu deinem Beitrag geht es ja im Beispiel um "Int". Nun da es sich bei mir jedoch nicht um Zahlen sondern um Text handelt, habe ich es eben mit Char versucht. Jedoch brachte dieses leider auch nicht zu dem Ergebniss, welches ich mir erhoffte.

    Quellcode

    1. //Auszug aus http://www.cplusplus.com/reference/algorithm/replace/
    2. int myints[] = { 10, 20, 30, 30, 20, 10, 10, 20 };
    3. vector<int> myvector (myints, myints+8); // 10 20 30 30 20 10 10 20
    4. replace (myvector.begin(), myvector.end(), 20, 99); // 10 99 30 30 99 10 10 99


    nun ich habe ja bereits den Wert im Vector bereits, der aus der CSV- Datei ausgelesen wurde. Problem ist, das genau dieser Vector myTokens[8] eine Variable Größe (Produktbeschreibung) hat. Nun dachte ich mir, ich lege den myTokens[8] in die Varaible content mit dem Type char. Um die chargröße mit anzugeben, hatte ich folgende Zeile ausprobiert.

    Quellcode

    1. char content[myTokens[8].size()+1] = myTokens[8];


    Nur leider bekomme ich dann wieder die Fehlermeldung, das die initialisierung variabler Größen nicht möglich sei.
    Also, wenn ich es richtig verstanden habe, lässt sich replace nur in Verbindung mit int oder char anwenden, jedoch nicht mit string. Gerade die Replace- Funktion benötige ich aber, oder etwas vergleichbares.
    oder liegt es daran das ich den Vector mit String initialisiere und sollte es besser mit char versuchen? (Fände ich nicht so schön.)

    Wenn mir vielleicht jemand mit dem richtigen Codeschnipsel auf die Sprünge helfen könnte, wäre ich ihm sehr dankbar.

    Vielleicht habe ich auch einfach nur einen dummen Denkfehler, weil ich von den anderen Programierstielen zu sehr verwöhnt wurde.

    Gruß
    CoPyMaus