Veröffentlicht 11. Juni 200817 j 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?
12. Juni 200817 j Einfach als csv abspeichern, dann wie eine normale Textdatei handhaben. Alternativ ODBC verwenden.
12. Juni 200817 j Autor @ 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?
12. Juni 200817 j 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.
12. Juni 200817 j 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 200817 j von TDM
12. Juni 200817 j Autor @ 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.
12. Juni 200817 j 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.
12. Juni 200817 j Autor 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?
12. Juni 200817 j 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.
13. Juni 200817 j (ganz abgesehen davon, dass man Arrays gar nichts zuweisen kann). Das stimmt so nicht ganz. char * text = "test"; ist bei mir eine Zuweisung.
13. Juni 200817 j char text[6] = "hallo"; cout << text; Output: hallo Jetzt ist es aber einer und es geht trotzdem.
13. Juni 200817 j Tut mir leid, Dich enttäuschen zu müssen, aber das ist eine Initialisierung, keine Zuweisung. (Dein erstes Beispiel übrigens auch).
13. Juni 200817 j Autor @ 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?
13. Juni 200817 j 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.
13. Juni 200817 j 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;
13. Juni 200817 j Fast. strcmp gibt 0 zurück, wenn die Strings gleich sind Echt? Ich sollte wohl mal wieder mehr mit C programmieren.
13. Juni 200817 j Autor 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; }
13. Juni 200817 j 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?
13. Juni 200817 j Im Übrigen solltest du beachten, dass strcmp case-sensitive ist, d.h. "text" und "Text" sind 2 unterschiedliche Strings.
13. Juni 200817 j 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.
13. Juni 200817 j Autor 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.
Archiv
Dieses Thema wurde archiviert und kann nicht mehr beantwortet werden.