Werte aus einer Datei überarbeiten und in eine neue Datei schreiben



  • Hallo liebe Forengemeinde,

    ich habe den Beitrag schon in anderen Foren gepostet. Leider konnte man mir nicht weiter helfen. Ich hoffe, Ihr könnt es. Folgende Ausgangssituation:

    In der Ursprungsdatei steht:

    ZE01.01;ZE01.01;8-596;Text 1
    ZE02;ZE02;99-852; Text 2

    Nun soll aber nur der erste Abschnitt umgewandelt werden in 76ZE0101. Es soll also folgendes in der Datei stehen:

    76ZE0101;ZE01.01;8-596;Text 1
    76ZE0200; ZE02;ZE02;99-852; Text 2

    Wie würdet ihr das machen? Wie ich den Punkt entferne, weiss ich in der Zwischenzeit, aber es soll ja nur der erste Teil bis zum ersten Semikolon umgebaut werden. Könnt ihr mir helfen? Danke schon mal im voraus.



  • In C ist das ein wenig komplizierter, weil du da nur die normalen String Funktionen aus string.h zur Verfügung hast und dich mit denen rumschlagen musst.

    In C++ wäre es vergleichsweise einfach.
    Die Datei zeilenweise je in einen std::string einlesen, mit den Methoden erase() und insert() jeweils den String so verändern bis er dir passt, und schließlich den daraus resultierenden String wieder in die Datei schreiben.

    Sicher kannst du das so ungefähr auch in C machen, nur is es da eben komplizierter.

    Viel Glück damit!



  • @ JustSomeCoder

    Ja ich weiss, dass es mit C++ einfacher geht, aber leider soll das mit C passieren. Also beantwortet es leider nicht meine Frage.

    Vielleicht wissen die anderen ja mehr. Wie würdet ihr den String so zusammensetzen, wie ihr den braucht?



  • Hallo.

    Ich würde wohl so vorgehen:

    Ein Char-Array definieren und dann jede Zeile der Datei in den String einlesen.
    Eine Funktion schreiben, die mir den String so bearbeitet, wie ich ihn haben will;
    den bearbeiteten String wieder in die Datei reinschreiben.
    Das Ganze vorgehen mit einer Schleife automatisieren.



  • Könntest Du mir ein kleines Beispiel dazu geben?



  • Alex_winf01 schrieb:

    Könntest Du mir ein kleines Beispiel dazu geben?

    #include <stdlib.h>
    #include <stdio.h>
    
    void string_fkt(char irgendwas[]){
    	int i=0;
    	while(irgendwas[i] != ';'){ //bis zum (ersten) Semilikon einlesen 
    		irgendwas[i]='a';    // hier müssen deine String-Operationen stehen
    		i++;
    	}
    }
    
    int main(void){
    
    	char irgendwas[50];
    
    	FILE *datei1, *datei2;
    
    	datei1 = fopen("blubb.txt","r");
    	if(datei1==NULL){
    		printf("bad pointer1");
    		system("PAUSE");	
    		exit(0);
    	}
    
    	datei2 = fopen("blubb1.txt","w+t");
    	if(datei2==NULL){
    		printf("dab pointer2");
    		system("PAUSE");
    		exit(0);
    	}
    
    	while(fgets(irgendwas, 50, datei1)){ //Zeile für Zeile auslesen
    		string_fkt(irgendwas);			 
    		fputs(irgendwas, datei2);
    	}
    
    	fclose(datei1);
    	fclose(datei2);
    
    	return 0;
    }
    

    Sag doch lieber, woran du gerade hängst. Ist es die Stringbearbeitung selbst? Oder irgendetwas anderes?



  • Also, so sieht mein Code bisher aus:

    #include <stdio.h>
    #include <string.h> 
    #include <stdlib.h>
    
    int main(void)
    {
        FILE *datei = fopen("Katalog_2.csv", "r");
        FILE *datei_neu = fopen("Kat_A2_5_MAS_ueberarbeitet.csv", "w+");
        char line [1000];
        //char* ptr = line;
    
        if(datei_neu == NULL)
        {
            printf("Fehler");
        }
    
        if (datei != NULL)
        {
            while (fgets(line, sizeof line, datei))
            {
                  int i;
                  for(i = 0; i< 7;i++)
                  {
                          fputc(line[i], datei_neu);
    
                  }
                  fputs(";", datei_neu);
                  for(i = 8; i<strlen(line)-1;i++)
                  {
                      // Dieser Bereich kümmert sich darum, dass der Punkt übersprungen wird
                    /*do
                    {
                        if(*ptr != 46)
                            fputc(*ptr, datei_neu);
                    }*/   
                        if(line[i] != 46)
                        {
                            fputc(line[i], datei_neu);
                        }
                        if(strlen(line) == 5)
                        {
                            fputs("00", datei_neu);
                        }
                  }
                  fputs("\n", datei_neu);
            }
        }
        else
        {
            printf("Fehler");
        }
        fclose(datei);
        fclose(datei_neu);
    
        return 0;
    }
    

    Mein Problem: den ersten Teilstring so lassen wie er ist, den zweiten so überarbeiten, dass der Punkt weg ist und die 76 davorsteht. Wenn der String z. B. ZE02 ist, muss da stehen 76ZE0200. D. h. ich muss eine 00 anhängen. Kannst Du mir da weiterhelfen?



  • Ohje, sry, aber wenn du einfach einen Bimbo suchst, der aus unerfindlichen Gruenden kostenlos dein Programm fuer dich zuende schreibt, weil du es nicht auf die Reihe bekommst (/bekommen willst), dann sag das doch besser gleich. 🙄



  • JustSomeCoder schrieb:

    In C ist das ein wenig komplizierter, weil du da nur die normalen String Funktionen aus string.h zur Verfügung hast und dich mit denen rumschlagen musst.
    In C++ wäre es vergleichsweise einfach.
    Die Datei zeilenweise je in einen std::string einlesen, mit den Methoden erase() und insert()...

    ich bitte dich. solche funktionen zur zeichenkettenbearbeitung hat jeder ernsthafte C-programmierer irgendwo in seiner sammlung.
    🙂



  • Finde ich auch, das Problem ist banal.



  • -fricky- schrieb:

    JustSomeCoder schrieb:

    In C ist das ein wenig komplizierter, weil du da nur die normalen String Funktionen aus string.h zur Verfügung hast und dich mit denen rumschlagen musst.
    In C++ wäre es vergleichsweise einfach.
    Die Datei zeilenweise je in einen std::string einlesen, mit den Methoden erase() und insert()...

    ich bitte dich. solche funktionen zur zeichenkettenbearbeitung hat jeder ernsthafte C-programmierer irgendwo in seiner sammlung.
    🙂

    Genau aus diesem Grund habe ich auch das Ganze zum Einen in den Vergleich mit den doch um sehr viel einfachereren Funktionen aus C++ gesetzt, und zum Anderen mit dem Ausdruck "ein wenig" die relative Sachlage nochmal verdeutlicht. 😉


Anmelden zum Antworten