Alex_winf01 Geschrieben 11. Juni 2008 Geschrieben 11. Juni 2008 Also, ich habe eine Excel-Datei vorliegen - namens test.xls. In test.xls liegt ein Tabellenblatt mit namen test. Auf diesem Tabellenblatt muss ich eine bestimmte ZELLE auslesen. Wie kann ich das von C aus machen? Zitieren
TDM Geschrieben 12. Juni 2008 Geschrieben 12. Juni 2008 Einfach als csv abspeichern, dann wie eine normale Textdatei handhaben. Alternativ ODBC verwenden. Zitieren
Alex_winf01 Geschrieben 12. Juni 2008 Autor Geschrieben 12. Juni 2008 @ TDM Danke schon mal für Deine Antwort. Ich habe noch folgende Frage: Angenommen, so sieht die Datei aus: Überschrift AA0505 BB0606 Überschrift 1 CC0707 DD0808 Die Werte sollen in eine Datei geschrieben werden, die wie folgt aussehen soll: AA0505;true;false;false BB0606;true;false;false CC0707;false;true;false DD0808;false;true;false Kannst Du mir da einen Ansatz zu geben? Zitieren
Klotzkopp Geschrieben 12. Juni 2008 Geschrieben 12. Juni 2008 Du hast doch schon einen Ansatz bekommen: Speichere die Datei als .csv, dann kannst du mit den Standard-C-Dateifunktionen arbeiten. Wenn das nicht geht, dann überleg dir, ob es unbedingt C sein muss, denn das dürfte eine der am wenigsten geeigneten Programmiersprachen für dieses Problem sein. AA0505;true;false;false BB0606;true;false;false CC0707;false;true;false DD0808;false;true;falseDu solltest auch erklären, nach welchem System da true oder false stehen soll. Zitieren
TDM Geschrieben 12. Juni 2008 Geschrieben 12. Juni 2008 (bearbeitet) Kannst Du mir da einen Ansatz zu geben? Iteriere die Zeilen aus Überschrift und Überschrift1 (oder war's nur ein Tippfehler?). Das speicherst du in einem Array (vorzugsweise Stringarray ) und dann, wenn du in die Datei schreibst, machst du eine synchrone Array-Zeilen-Iteration, d.h. für jede Zeile die du weitergehst, nimmst du das nächste Objekt aus dem Array (oder anders rum: jedes mal wenn du ein neues objekt nimmst, beginnst du vorher eine neue Zeile). Folglich stehen dann die Daten immer am Zeilenanfang, danach kommt dann der Separator und dann der Rest. Wenn das aber wieder eine xls ist, dann verweiße ich mal auf Klotzkopps Post vor mir, denn die Formatierung der Datei ändert nichts an der Tatsache, dass du eine Schnittstelle zwischen C und dem xls-Format brauchst. (Also entweder CSV, COM oder ODBC) Edit: Ok, das Letzte streichen, ist ja immer eine XLS - war grad gedanklich in dem anderen Thread. Bearbeitet 12. Juni 2008 von TDM Zitieren
Alex_winf01 Geschrieben 12. Juni 2008 Autor Geschrieben 12. Juni 2008 @ Klotzkopp Dann habe ich mich unklar ausgedrückt. Die Datei ist als csv abgespeichert. Zur Systematik, wo true oder false steht: Ab der Überschrift steht da true; false; false. Ab Überschrift 1 (Kein Tippfehler) steht dann da false; true; false. Mir geht es nur darum, dass die Zeile Überschrift nicht mit in die neue Datei kommt und wie ich abprüfen kann, in welcher Zeile Überschrift 1 steht. Zitieren
TDM Geschrieben 12. Juni 2008 Geschrieben 12. Juni 2008 Ach, jetzt versteh ich das. joar, dann machstes wie folgt: 1. Dateizeile einlesen 2. Wenn leer dann nächste Zeile 3. Wenn Text = ÜBerschrift, dann attribute merken. 4. Nächste Zeile, erstes Wort zum Separator lesen (csv==';') 5. Wort merken + an den String die Eigenschaften für die jeweilige Überschrift anfügen. 6. wiederhole 4 bis Leerzeile 7. wiederhole 2 bis EOF Wär zumindest mein erster Denkansatz. Zitieren
Alex_winf01 Geschrieben 12. Juni 2008 Autor Geschrieben 12. Juni 2008 char line [128]; while(fgets(line, sizeof line, datei)) { if(line = "Text"); { fputs(line, datei_neu); fputs("true;", datei_neu); fputs("false;", datei_neu); fputs("false;", datei_neu); } } Mein Problem: Text ist kein char. Wie kann ich in C einen String definieren? In Java geht das so: String abc = "Irgendein Text"; Wie kann ich vergleichen, dass in line = "Text" steht? Zitieren
Klotzkopp Geschrieben 12. Juni 2008 Geschrieben 12. Juni 2008 Mein Problem: Text ist kein char.Das ist nicht dein Problem. Dein Problem ist, dass line = "Text" eine Zuweisung ist. Du willst aber einen Vergleich (ganz abgesehen davon, dass man Arrays gar nichts zuweisen kann). Einen Vergleich macht man (wie übrigens auch in Java) mit ==. Allerdings funktioniert auch das nicht bei Arrays. In C sind Strings nullterminierte Arrays von char bzw. Zeiger auf das erste Element eines solchen Arrays. Vergleichen kannst du sie mit der Funktion strcmp. Zitieren
TDM Geschrieben 13. Juni 2008 Geschrieben 13. Juni 2008 (ganz abgesehen davon, dass man Arrays gar nichts zuweisen kann). Das stimmt so nicht ganz. char * text = "test"; ist bei mir eine Zuweisung. Zitieren
Klotzkopp Geschrieben 13. Juni 2008 Geschrieben 13. Juni 2008 char * text = "test"; ist bei mir eine Zuweisung. Schon. Aber text ist kein Array. Zitieren
TDM Geschrieben 13. Juni 2008 Geschrieben 13. Juni 2008 char text[6] = "hallo"; cout << text; Output: hallo Jetzt ist es aber einer und es geht trotzdem. Zitieren
Klotzkopp Geschrieben 13. Juni 2008 Geschrieben 13. Juni 2008 Tut mir leid, Dich enttäuschen zu müssen, aber das ist eine Initialisierung, keine Zuweisung. (Dein erstes Beispiel übrigens auch). Zitieren
Alex_winf01 Geschrieben 13. Juni 2008 Autor Geschrieben 13. Juni 2008 @ All ich habe noch eine grundsätzliche Frage: Angenommen line == "Text", dann soll er diese Zeile überspringen und gleich zur nächsten gehen. Wie kann ich das in C realisieren? Zitieren
TDM Geschrieben 13. Juni 2008 Geschrieben 13. Juni 2008 Tut mir leid, Dich enttäuschen zu müssen, aber das ist eine Initialisierung, keine Zuweisung. (Dein erstes Beispiel übrigens auch). Gut, lassen wir das lieber wegen OT. Angenommen line == "Text", dann soll er diese Zeile überspringen und gleich zur nächsten gehen. Wie kann ich das in C realisieren? if (strcmp("Text",line)) continue; Folglich springt er wieder hoch zum while und liest die nächste Zeile. Zitieren
Klotzkopp Geschrieben 13. Juni 2008 Geschrieben 13. Juni 2008 if (strcmp("Text",line)) continue; [/CODE] Folglich springt er wieder hoch zum while und liest die nächste Zeile. Fast. strcmp gibt 0 zurück, wenn die Strings gleich sind: [CODE] if (strcmp("Text",line) [COLOR="Blue"]== 0[/COLOR]) continue; Zitieren
TDM Geschrieben 13. Juni 2008 Geschrieben 13. Juni 2008 Fast. strcmp gibt 0 zurück, wenn die Strings gleich sind Echt? Ich sollte wohl mal wieder mehr mit C programmieren. Zitieren
Alex_winf01 Geschrieben 13. Juni 2008 Autor Geschrieben 13. Juni 2008 Leider funzt es noch nicht, die Zeile wird trotzdem noch mit in die neue Datei genommen. Hier der Code: #include <stdio.h> #include <iostream> #include <fstream> #include <cstring> int main(void) { FILE *datei = fopen("Kat_A2_5.csv", "r"); FILE *datei_neu = fopen("Kat_A2_5_MAS_ueberarbeitet.csv", "w+"); if (datei != NULL) { char line [128]; while (fgets(line, sizeof line, datei)) { if(strcmp("text", line) == 0) { continue; } else { fputs(line, datei_neu); fputs("2008;", datei_neu); fputs("true", datei_neu); fputs("false", datei_neu); fputs("false", datei_neu); } } fclose(datei); fclose(datei_neu); } else { // Fehlerbehandlung } return 0; } Zitieren
Klotzkopp Geschrieben 13. Juni 2008 Geschrieben 13. Juni 2008 Leider funzt es noch nicht, die Zeile wird trotzdem noch mit in die neue Datei genommen.Was steht denn in der Zeile drin? Wirklich nur das Wort text und sonst nichts? Zitieren
TDM Geschrieben 13. Juni 2008 Geschrieben 13. Juni 2008 Im Übrigen solltest du beachten, dass strcmp case-sensitive ist, d.h. "text" und "Text" sind 2 unterschiedliche Strings. Zitieren
Alex_winf01 Geschrieben 13. Juni 2008 Autor Geschrieben 13. Juni 2008 Da steht nur das Wort text drin, nichts anderes. Und auch klein geschrieben. Zitieren
TDM Geschrieben 13. Juni 2008 Geschrieben 13. Juni 2008 Hast du mal durchdebuggt und dir den Wert der vermeintlichen Zeile angesehen, ob er wirklich nur "text" ist? Ich weißt nicht wie weit fgets geht, vermutlich könnte es sein, dass er das \r oder \n am Ende der Zeile mitnimmt, dann passt der Stringvergleich natürlich nicht mehr. Zitieren
Klotzkopp Geschrieben 13. Juni 2008 Geschrieben 13. Juni 2008 Was steht denn dann in der Ausgabedatei? text2008;truefalsefalse? Zitieren
Alex_winf01 Geschrieben 13. Juni 2008 Autor Geschrieben 13. Juni 2008 @ Klotzkopp in der Ausgabedatei steht nur text drin. Nix weiter. Zitieren
Alex_winf01 Geschrieben 13. Juni 2008 Autor Geschrieben 13. Juni 2008 Bin einen Schritt weiter, wenn ich statt if(strcmp("text", line) == 0) folgendes schreibe: if(strcmp("text\n", line) == 0), dann wird die erste Zeile nicht mitgenommen. ABER: Die nächste Zeile wird nicht so reingeschrieben wie sie sollte. Also statt AAA;true;false;false steht da in der Ausgabedatei nur AAA. 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.