Zum Inhalt springen

Frage zur Handhabung mit Dateien


Alex_winf01

Empfohlene Beiträge

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

  • text1
  • text2
  • text
  • 3
  • text 4

oder

  • text1 text2
  • (leer)
  • text 3 text
  • 4
  • (leer)

oder

  • (leer)
  • (leer)
  • text1 text2 text 3
  • text
  • 4

oder irgendeine andere mögliche Kombination ist?

Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 2 Wochen später...

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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]

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

@ 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 von Alex_winf01
Link zu diesem Kommentar
Auf anderen Seiten teilen

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" schreiben
  • Ersten 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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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