Alex_winf01 Geschrieben 1. August 2008 Geschrieben 1. August 2008 Ich habe da noch mal ne Frage zum Thema Dateien: Ich habe eine csv-Datei vorliegen, die wie folgt Strukturiert ist: 'text1', 'text2', 'text3', '', 'text4' Mich interessiert jetzt nur der Wert '', also die Zelle, wo nichts drinnsteht. Wie kann ich direkt abfragen, ob die 4. Spalte leer ist? Es betrifft immer die Spalte 4, also in der 1. Zeile betrifft es die Spalte 4 genauso wie in der Zeile 999. Zitieren
Klotzkopp Geschrieben 1. August 2008 Geschrieben 1. August 2008 Falls in den Texten selbst keine Apostrophen vorkommen dürfen: Such den siebten Apostroph, und prüfe, ob das Zeichen danach wieder ein Apostroph ist. Zitieren
LadyPreis Geschrieben 1. August 2008 Geschrieben 1. August 2008 ohne jetzt große C-Kentnisse zu haben: Von der logik her würde ich die Zeile aus der Datei einlesen und in einem string speichern. diesen string zerlegst du dann mittels eines arrays immer ab der stelle nach dem Komma. Danach kannst du ja wunderbar auf den 4. Eintrag im Array zugreifen, und diesen abfragen Gruß Die Lady Nachtrag: Funktioniert nach dem gleich Schema wie von Klotzkopp gepostet. Kannst dich für die jeweilige Suche entscheiden, je nachdem, welches Zeichen (Apostroph oder Komma) in deinen Texten nicht vorkommt Zitieren
Alex_winf01 Geschrieben 1. August 2008 Autor Geschrieben 1. August 2008 @ LadyPreis Das mit dem Array würde ja auch funktionieren, wenn die einzelnen Werte nicht Über ein Hochkomma oder Semikolon getrennt sind. Verstehe ich das richtig, dass es auch funktioniern muss, wenn in der Datei steht: text1 text2 text 3 leer text 4 Statt leer ist die Zelle natürlich leer, da steht nichts drinn. Müsste mit dem Array dann auch Funktionieren. Da müsste ich doch nur den 4. Eintragu auf '' überprüfen, oder? Zitieren
Klotzkopp Geschrieben 1. August 2008 Geschrieben 1. August 2008 text1 text2 text 3 leer text 4 Statt leer ist die Zelle natürlich leer, da steht nichts drinn. Müsste mit dem Array dann auch Funktionieren. Da müsste ich doch nur den 4. Eintragu auf '' überprüfen, oder? Nein, kann nicht funktionieren. Du brauchst ein Zeichen, das im Text selbst nicht vorkommen kann oder durch eine Escapesequenz geschützt wird, wenn es dennn vorkommt. In deinem Beispiel tritt das Trennzeichen (das Leerzeichen) auch in den Texten auf. Woher willst du wissen, ob das text1text2text3text 4 oder text1 text2(leer)text 3 text4(leer) oder (leer)(leer)text1 text2 text 3text 4 oder irgendeine andere mögliche Kombination ist? Zitieren
Alex_winf01 Geschrieben 1. August 2008 Autor Geschrieben 1. August 2008 @ Klotzkopp Wie würdest Du denn das prüfen, ob die 4. Spalte einer Zeile leer ist? Die Datei liegt auch als xls-Datei vor. Zitieren
TDM Geschrieben 1. August 2008 Geschrieben 1. August 2008 Auch wenn ich nicht Klotzkopp bin: Datenbankabfrage drüberjagen und prüfen wo Zellinhalt == "" bzw. null. Zitieren
Klotzkopp Geschrieben 1. August 2008 Geschrieben 1. August 2008 Wie würdest Du denn das prüfen, ob die 4. Spalte einer Zeile leer ist? Wenn du eine cvs-Datei hast, dann sind die einzelnen Felder doch mit Semikolon abgetrennt, oder? Dann kannst du so vorgehen, wie LadyPreis es vorgeschlagen hat. Zitieren
Alex_winf01 Geschrieben 13. August 2008 Autor Geschrieben 13. August 2008 @ Klotzkopp Ich habe mit der Umsetzung von der Lösung von LadyPreis Probleme. Also angenommen die Zeile sieht wie folgt aus: text1; text2bla; text3blub; ; text5texttexttext nun speicher ich die Zeile wie folgt ab: char line [128]; Wie kann ich jetzt den String zerlegen und abprüfen, ob der 4. Eintrag leer ist? Zitieren
TDM Geschrieben 14. August 2008 Geschrieben 14. August 2008 Wie kann ich jetzt den String zerlegen und abprüfen, ob der 4. Eintrag leer ist? split + trim + array[3] == "" Zitieren
Alex_winf01 Geschrieben 14. August 2008 Autor Geschrieben 14. August 2008 Also so was? Natürlich ist das Beispiel noch nicht vollständig. int main(){ int okt[10]; // Array mit Integer-Werten für die Oktetten und Maskenl. char buffer[20]; // hier liegt die IP-Adresse als Zeichenkette strcpy(buffer, "172.31.32.0/24"); // IP auf den buffer kopieren split(okt, buffer); // Die Oktetten liegen nun auf okt[0] bis okt[3] // Die Maskenlänge liegt auf okt[4] return 0; } Das ist ein Beispiel von Berechnen von IP-Adressen in der Programmiersprache c Zitieren
TDM Geschrieben 14. August 2008 Geschrieben 14. August 2008 Also so was? Eigentlich nicht. Das ist ja eine eigene split-Funktion (siehe link, drüber) die was in einen Array läd, ich meinte eher sowas: string str = "text1; text2bla; text3blub; ; text5texttexttext"; vector<string> tokens; Tokenize(str, tokens, ";"); for(unsigned int i = 0; i < tokens.size(); i++) { string trimmed = trim(tokens[i], " "); cout << i << ". Wort = " << (trimmed.empty() ? "leer" : "nicht leer") << endl; } [hüstel] void Tokenize(const string& str, vector<string>& tokens, const string& delimiters = " ") { // Skip delimiters at beginning. string::size_type lastPos = str.find_first_not_of(delimiters, 0); // Find first "non-delimiter". string::size_type pos = str.find_first_of(delimiters, lastPos); while (string::npos != pos || string::npos != lastPos) { // Found a token, add it to the vector. tokens.push_back(str.substr(lastPos, pos - lastPos)); // Skip delimiters. Note the "not_of" lastPos = str.find_first_not_of(delimiters, pos); // Find next "non-delimiter" pos = str.find_first_of(delimiters, lastPos); } } std::string trim ( std::string const& str, char const* sepSet="") { std::string::size_type const first = str.find_first_not_of(sepSet); return ( first==std::string::npos ) ? std::string() : str.substr(first, str.find_last_not_of(sepSet)-first+1); } [/hüstel] Zitieren
Alex_winf01 Geschrieben 14. August 2008 Autor Geschrieben 14. August 2008 @ TDM substr() gibt es so in C nicht (siehe anderer Beitrag). Bist Du vielleicht in C++ "verrutscht"? Zitieren
Alex_winf01 Geschrieben 14. August 2008 Autor Geschrieben 14. August 2008 @ TDM So kann man auch einen String zerlegen: char str[] = "now # is the time for all # good men to come to the # aid of their country"; char delims[] = "#"; char *result = NULL; result = strtok( str, delims ); while( result != NULL ) { printf( "result is \"%s\"\n", result ); result = strtok( NULL, delims ); } Liefert: result is "now " result is " is the time for all " result is " good men to come to the " result is " aid of their country" Jetzt braucht man es "nur" noch in ein Array packen und dann auf "" prüfen. Zitieren
TDM Geschrieben 15. August 2008 Geschrieben 15. August 2008 @ TDM substr() gibt es so in C nicht (siehe anderer Beitrag). Bist Du vielleicht in C++ "verrutscht"? Ja, aber die Algorithmik ist die selbe, wenn du abprüfen willst, ob leer. btw: von C hab ich hier nirgendswo was gelesen. :floet: Zitieren
Alex_winf01 Geschrieben 15. August 2008 Autor Geschrieben 15. August 2008 @ TDM OK, wie würdest Du es in C programmieren? Das abprüfen auf ""? Zitieren
Alex_winf01 Geschrieben 15. August 2008 Autor Geschrieben 15. August 2008 Also, ich habe mit der Umsetzung noch ein paar Probleme mit der C-Programmierung: #include <string.h> #include <stdio.h> int main(void) { FILE *datei = fopen("Datei1csv", "r"); FILE *datei_neu = fopen("Datei2.csv", "w+"); char line [] = "Dies ist ein Teilstring"; char delims[] = ";"; char *result; char anfang[]="76"; char *substring = NULL; char zeichen[]="ZE01.01 2)"; if (datei != NULL) { while (fgets(line, sizeof line, datei)) { printf(line); result = strtok(line, delims); while(result != NULL) { //if(strcmp("Text 1", result) == 0) continue; //else if(strcmp("Text 2", result) == 0) continue; //printf(result); if (strlen(zeichen)==5) { strcat(anfang,zeichen); fputs(anfang, datei_neu); puts(anfang); result = strtok(line, delims); } else if (strlen(zeichen)==10) { substring= strstr (zeichen,"."); result = strncpy(substring,"01",5); result = strcat(anfang,zeichen); fputs(result, datei_neu); puts(anfang); result = strtok(line, delims); } getch(); } } } } Ich lese Werte aus einer csv-Datei aus (Datei1.csv) und muss die Werte überarbeitet wieder in eine neue Datei (Datei2.csv) reinschreiben. Die Werte aus der 1. Datei sehen wie folgt aus: Text1;;Text2 --> Diese Zeile soll nicht mit in die neue Datei ZE01.01;beschreibung --> ZE01.01 muss zu 76ZE0101 werden ZE02;beschreibung1 --> ZE02 muss zu 76ZE0200 werden. In der neuen Datei soll dann stehen: 760101;beschreibung 760200;beschreibung1 Könnt ihr mir nochmals helfen? Bitte nicht prügeln Ich bin ein Anfänger, was die C-Programmierung angeht. Wenn ihr mich prügeln wollt, dann bitte. Und dass die Kommentarzeilen nicht ausgeführt werden, dass weiss ich. So funzt es ja leider nicht. Und dass dieser Bereich noch nicht passt, weiss ich auch (ist das Hauptproblem): f (strlen(zeichen)==5) { strcat(anfang,zeichen); fputs(anfang, datei_neu); puts(anfang); result = strtok(line, delims); } else if (strlen(zeichen)==10) { substring= strstr (zeichen,"."); result = strncpy(substring,"01",5); // kann so nicht funzen result = strcat(anfang,zeichen); fputs(result, datei_neu); puts(anfang); result = strtok(line, delims); } getch(); Wie gesagt, wenn ihr auf mir rumprügeln wollt, bitte. Ich bitte Euch nur um Hilfe. Zitieren
Alex_winf01 Geschrieben 16. August 2008 Autor Geschrieben 16. August 2008 Könnt ihr mir nicht nochmal helfen? Mir macht diese Zeile Probleme: result = strncpy(substring,"01",5); Sobald ich die "01" mit der Variable result austausche, fliegt mir der Funktionsaufruf im Debugger um die Ohren. Zitieren
Klotzkopp Geschrieben 16. August 2008 Geschrieben 16. August 2008 Sobald ich die "01" mit der Variable result austausche, fliegt mir der Funktionsaufruf im Debugger um die Ohren. Und warum? Debugger geben in ihren Meldungen selten Hinweis auf irgendwelche "Ohren". Welche Werte haben substring und result an dieser Stelle? Nur als Hinweis: Du würdest vermutlich mehr und bessere Hilfe bekommen, wenn du erklären würdest, was der Code eigentlich im Detail tun soll. Das ist nämlich aus deinem etwas verworrenen Code nicht so einfach zu erkennen. Und wenn man nicht erkennen kann, was der Code tun soll, kann man auch keine Logikfehler finden. Aber um einen solchen handelt es sich offenbar. Zitieren
Alex_winf01 Geschrieben 16. August 2008 Autor Geschrieben 16. August 2008 @ Klotzkopp Also, der Code soll folgendes tun: Die Werte aus Datei1.csv (Hier habe ich den Punkt vergessen) auslesen. In dieser Datei stehen folgende Werte: Text1;;Text2 ZE01.01;beschreibung; irgendeinText ZE02;beschreibung1; irgendeinText ZE05.05; beschreibung; irgendeinText ZE13.00; beschreibung; irgendeinText In der Datei2.csv soll dann stehen: ZE01.01;76ZE0101;beschreibung;; irgendeinText ZE02;76ZE0200;beschreibung1; irgendeinText ZE05.05; 76ZE0505;beschreibung; irgendeinText ZE13.00; 76ZE1300;beschreibung; irgendeinText Jetzt gibt der Compiler keine Fehlermeldung mehr, wenn ich 01 durch die Variable zeichen ersetze. ABER: es wird nichts in die Datei reingeschrieben. Bitte helft mir. Ich weiss, dass ich was die C-Programmierung angeht, noch blutiger Anfänger bin. Ist aber jetzt klar geworden, wass ich will? Zitieren
Klotzkopp Geschrieben 16. August 2008 Geschrieben 16. August 2008 Ich wollte eigentlich wissen, wie der Code das beschriebene Ziel erreichen soll. Ich habe aber so langsam den Eindruck, dass du das selbst nicht weißt, sondern ziellos herumfrickelst. Korrigiere mich, wenn ich mich da irre. Das ist übrigens kein "Herumprügeln", sondern eine sachliche Einschätzung deiner Vorgehensweise. Hier mal ein paar allgemeine Kommentare: FILE *datei = fopen("Datei1csv", "r"); FILE *datei_neu = fopen("Datei2.csv", "w+");[/CODE] Hier fehlt die Fehlerbehandlung. [CODE]while (fgets(line, sizeof line, datei)) Sicher, dass du nie mehr als 23 Zeichen lesen musst? Mehr passt nämlich in line nicht rein. if (strlen(zeichen)==5) Warum 5? strcat(anfang,zeichen); Du darfst an anfang nichts anhängen. Das Array ist so groß, wie du es initialisiert hast, und damit voll. result = strtok(line, delims); Nachfolgende strtok-Aufruf musst du mit NULL als erstem Parameter machen, wenn du den String weiter zerlegen willst. else if (strlen(zeichen)==10) Auch hier: Warum 10? substring= strstr (zeichen,"."); result = strncpy(substring,"01",5);[/code] Auch hier: Warum 5? Klar, mehr passt nicht rein. Die Strings, die du einfügen willst, sind aber anscheinend länger. [code] result = strcat(anfang,zeichen); Siehe oben. result = strtok(line, delims); Siehe oben. Zitieren
Alex_winf01 Geschrieben 16. August 2008 Autor Geschrieben 16. August 2008 (bearbeitet) @ Klotzkopp Also. Folgender Beitrag ist noch wichtig: http://forum.fachinformatiker.de/c-c/118820-teilstring-c-ermitteln.html In diesem Beitrag hat brandyandy folgenden Code als Beispiel gebracht: #include<stdio.h> #include<conio.h> #include<string.h> int main() { char zeichen[]="ZEXXX"; char anfang[]="76"; char * substring; if (strlen(zeichen)==5) { strcat(anfang,zeichen); puts(anfang); } else if (strlen(zeichen)==8) { substring= strstr (zeichen,"."); strncpy(substring,"YY",5); strcat(anfang,zeichen); puts(anfang); } else { } getch(); return 0; } Warum 5? 5 Deshalb wegen dem String ZE02 --> muss also 4 sein an dieser Stelle. Auch hier: Warum 10? 10 wegen dem Teilstring ZE05.05 --> muss also 7 sein an dieser Stelle. Und dass die Fehlerbehandlung für die Dateiöffnung fehlt, dass weis ich auch --> bringt mir der Lösung nicht nährer. Wenn Du meinst, ich frickle nur rum, eine kurze Frage: Wie würdest Du das machen? Ich suche verdammt zur Zeit verzweifelt eine Möglichkeit, diesen blöden Punkt aus dem String zu entfernen und den Teilstring 76 davorzustellen. Kannst Du mir wenigstens dabei helfen? Wie kann ich aus ZE05.00 den Punkt entfernen und die 76 davorstellen? In anderen Programmiersprachen kann ich die Methoden left(), right() oder substring() nutzen für solche Sachen. In C gibt es so was nicht direkt! Bearbeitet 16. August 2008 von Alex_winf01 Zitieren
Klotzkopp Geschrieben 17. August 2008 Geschrieben 17. August 2008 In diesem Beitrag hat brandyandy folgenden Code als Beispiel gebracht:Dieser Code hat ähnliche Fehler wie deiner. Du darfst an anfang nichts mit strcat anhängen. Und strlen( zeichen ) kann nie 8 sein, ohne dass das Programm vorher über die Grenzen des Arrays zeichen hinausgeschrieben hat, denn in zeichen passen nur 5 Zeichen. 5 Deshalb wegen dem String ZE02 --> muss also 4 sein an dieser Stelle.Jetzt habe ich es verstanden. Dieser an sich gute Ansatz scheitert bei dir daran, dass du die Bedeutung der einzelnen Variablen falsch in dein Programm übertragen hast. Was wiederum daran liegt, dass du den Code nicht verstanden hast. Womit wir wieder beim Grundproblem wären. Und dass die Fehlerbehandlung für die Dateiöffnung fehlt, dass weis ich auch --> bringt mir der Lösung nicht nährer.Es würde dir aber guttun, wenn du dir mal eine Arbeitsweise angewöhnen würdest, die die Fehlersuche erleichtert. Warte doch nicht ab, bis du wegen eines fehlgeschlagenen fopen wieder Stunden und Tage mit der Fehlersuche vergeudest. Wenn Du meinst, ich frickle nur rum, eine kurze Frage: Wie würdest Du das machen?Ich würde den fraglichen String Zeichen für Zeichen in die Ausgabedatei schreiben, und wenn der Punkt kommt, diesen einfach überspringen. Du musst nicht den ganzen String auf einmal in die Datei schreiben, daher brauchst du den auch nicht mühsam zusammenzusetzen. Kannst Du mir wenigstens dabei helfen?Was soll denn bitte "wenigstens" heißen? Ich versuche hier nun schon seit einiger Zeit, dir klarzumachen, dass deine Vorgehensweise nicht zielführend ist. Leider nimmst du dir davon nichts an, sondern machst genau so weiter. Du bastelst anscheinend irgendwelche Codefetzen zusammen, ohne genau zu verstehen, was diese tun. Das funktioniert nicht, zumindest nicht, sobald die Programme nicht mehr trivial sind. Ich kann auch nicht zufällig irgendwelche Ziegelsteine auf einen Haufen werfen, und dann hoffen, dass daraus ein Haus wird, wenn ich das nur lange genug mache. Wie kann ich aus ZE05.00 den Punkt entfernen und die 76 davorstellen? In anderen Programmiersprachen kann ich die Methoden left(), right() oder substring() nutzen für solche Sachen. In C gibt es so was nicht direkt! Es gibt für all diese Sachen relativ einfache Ersetzungen in C, wenn man sich ein wenig mit Arrays auskennt, und wie Strings in C dargestellt werden. Das Problem ist, dass damit meistens die Notwendigkeit verbunden ist, dynamischen Speicher zu benutzen. Das alles brauchst du hier aber gar nicht. Ich gebe dir mal ein Beispiel für den Inhalt der fgets-Schleife: Ersten Teilstring ermitteln und schreiben.";76" schreibenErsten Teilstring nochmal zeichenweise schreiben, dabei '.' überspringen.Wenn der Teilstring die Länge 7 hat, "00" schreiben.Die restlichen Teilstrings ermitteln und schreiben. Etwas in dieser Art aufzustellen, wäre deine Aufgabe gewesen, und zwar bevor du auch nur eine einzige Zeile Code hättest schreiben sollen. Gerade als "blutiger Anfänger" solltest du das Erarbeiten des Algorithmus und das Ausprogrammieren nicht mischen, weil du in beidem noch nicht sattelfest bist. Formuliere zuerst den Algorithmus, und übertrage ihn dann in eine Programmiersprache. Mit der Zeit wirst du genügend Erfahrung sammeln, um Algorithmen so zu formulieren, dass sie in der jeweiligen Sprache leicht umzusetzen sind. Ich habe dir jetzt den ersten und wichtigsten Teil der Arbeit abgenommen. Setz das jetzt bitte mal in C um, genau so, wie es da steht. Dafür brauchst du weder str(n)cpy noch strcat. Zitieren
Alex_winf01 Geschrieben 17. August 2008 Autor Geschrieben 17. August 2008 @ Klotzkopp OK, ich habe verstanden, dass Du mir helfen willst. Ersten Teilstring ermitteln und schreiben. Wenn Du den anderen Thread gelesen hättest, wüsstest Du das ich GENAU DAMIT ein Problem habe. Wie kann ich in C einen Teilstring ermitteln? In Java gibt es substr(), in VBA gibt es LEFT und RIGHT. Und in C gibt es so was nicht!!! Könntest Du mir für diesen Punkt weiterhelfen? Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.