Zum Inhalt springen

Empfohlene Beiträge

Geschrieben

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?

  • Antworten 63
  • Erstellt
  • Letzte Antwort

Top-Benutzer in diesem Thema

Geschrieben

@ 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?

Geschrieben

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;false

Du solltest auch erklären, nach welchem System da true oder false stehen soll.
Geschrieben (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 von TDM
Geschrieben

@ 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.

Geschrieben

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.

Geschrieben


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?

Geschrieben
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.

Geschrieben
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.

Geschrieben

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;

Geschrieben

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;

}

Geschrieben

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.

Geschrieben

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.:(

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...