0 Daumen
450 Aufrufe

Frage:

Hallo,

ich versuche seit ein paar Tage das Problem zu lösen, allerdings vergeblich. Deshalb Frage ich um einen Tipp.

Ich möchte eine Textdatei durchsuchen, und nur jene Zeilen Ausgeben wo die ID Nummer unterschiedlich ist. -> das funktioniert.
ID ist eine Eindeutige Nummer anhand man die jeweiligen Daten zuordnen kann. Das Problem ist dass ab und zu der Namen in einer Zeile fehlt. Ich möchte aber bei jeder Konsolen Ausgabe den Namen haben. Aber das Funktioniert aktuell nicht da z.b eine Zeile keinen Namen hat.

Aktuell wird da "Test" ausgegeben. Ich möchte nun dass anstatt von "Test" der nachfolgende Name hineingeschrieben wird.

Aber da müsste ich ja dann immer eine Zeile vorspringen. Ich komme nicht drauf wie ich das lösen kann.

Aktuell ist die Ausgabe so:
ID   Name                    
10000  OPTIMUM MANUFACTURING              
12781  LACLEDE GAS CO                      
13901  Test
13902  Test

Wunsch Ausgabe ist so:
ID   Name              
10000  OPTIMUM MANUFACTURING              
12781  LACLEDE GAS CO                      
13901  HILIP MORRIS INC
13902  Water INC

https://onlinegdb.com/gOZ7UMMNu


Code:


/******************************************************************************
*******************************************************************************/
#include <stdio.h>
#include <string.h>

int main ()
{

char puffer[1200], aa[100], aa_vorher[100], bb[100], cc[100], dd[100], ee[100], ff[100], ff_vorher[100];
int count_strlen = 0;
int count_anzahlLeerzeichen = 0;
int countZahlen=0;

FILE *f=fopen("/tmp/abc123", "w");
   
  fputs("ID; Datum; Ticker1;Ticker2    ; Ticker3  ;    Name                     ;\n"
"10000; 07/01/1986; 68391610;    ; 8391610  ; OPTIMUM MANUFACTURING               ;\n"
"12781; 30/11/1970; 84857L10;    ; 0558810  ; LACLEDE GAS CO                       ;\n"
"13901; 27/05/1955; 02209S10;    ;          ;                                      ;\n"
"13901; 31/05/1955; 02209S10;    ;          ; HILIP MORRIS INC                     ;\n"
"13901; 01/06/1955; 02209S10;    ;          ; HILIP MORRIS INC                     ;\n"
"13901; 02/06/1955; 02209S10;    ;          ; HILIP MORRIS INC                     ;\n"
"13901; 03/06/1955; 02209S10;    ;          ; HILIP MORRIS INC                     ;\n"
"13902; 03/06/1955; 02209S10;    ;          ;                                      ;\n"
"13902; 03/06/1955; 02209S10;    ;          ; Water INC                           ;\n"
"13902; 03/06/1955; 02209S10;    ;          ; Water INC                           ;\n"
,f);
  fclose(f);
 
  f=fopen("/tmp/abc123","r");


if (f == NULL)
  {
    printf ("Fehler\n");
  }


while (fgets (puffer, 1200, f))
{
  sscanf (puffer, "%[^;];%[^;];%[^;];%[^;];%[^;];%[^;];\n", aa, bb, cc, dd, ee, ff);
   
  // Länge vom char Array ff ermitteln
  {
    count_strlen = strlen (ff);
  }
  // Wenn sich aa im vergleich zu aa_vorher verändert hat dann wird mit der for-Schleife überprüft
  //ob das Array ff mehr als 35 Leerzeichen enthält.
    if (strcmp (aa, aa_vorher))
    {
      for (int i = 0; ff[i]; i++)
        {
              // Hier werden die Anzahl an Leerzeichen in ff überprüft
        if (ff[i] == ' ')
    {
        count_anzahlLeerzeichen++;
    }

        // Wenn mehr als 35 Leerzeichen in ff vorhanden sind, ist das ff array leer.
        // Hier sollte nun nicht "Test" hineingeschrieben werden sondern der string ff aus der nachfolgenden Zeile
        if (count_anzahlLeerzeichen > 35)
    {
        strcpy (ff, " Test");
    }


    }
   
  printf ("%s %s\n",aa, ff);
  count_anzahlLeerzeichen = 0;
 
  // Hier Versuche ich das vorherige ff array abzuspeichern. Aber ich glaube das bringt mir nichts
  strcpy (ff_vorher, ff);

}

strcpy (aa_vorher, aa);

}
fclose (f);
return 0;

}

Avatar von

1 Antwort

0 Daumen
          // Wenn mehr als 35 Leerzeichen in ff vorhanden sind, ist das ff array leer.
        // Hier sollte nun nicht "Test" hineingeschrieben werden sondern der string ff aus der nachfolgenden Zeile
      if (count_anzahlLeerzeichen > 35)
  {
      strcpy (ff, " Test");
  }

Löschen

    printf ("%s %s\n",aa, ff)

Ersetzen durch

if (count_anzahlLeerzeichen <= 35) {
printf ("%s %s\n",aa, ff);
strcpy (aa_vorher, aa);
}
 strcpy (aa_vorher, aa);

Löschen

Avatar von 5,7 k

Wow vielen Dank. Auf diese Lösung wäre ich echt nicht gekommen :)

Danke für die Hilfe!

Es ist gefährlich, aus konkreten Beispielen Regeln abzuleiten. Beispiele sind dazu gedacht, Regeln zu verdeutlichen. Sie sind nicht dazu gedacht, daraus Regeln aufzustellen.

Ich möchte eine Textdatei durchsuchen

Normalerweise gehört dazu eine Spezifikation, wie die zu durchsuchende Textdatei aufgebaut ist.

ID ist eine Eindeutige Nummer anhand man die jeweiligen Daten zuordnen kann.

Das ist keine hinreichende Spezifikation.

In meinem Lösungsvorschlag bin ich davon ausgegangen, dass gleiche IDs in aufeinanderfolgenden Zeilen stehen. Es darf also nicht vorkommen, dass die ID 13901 in Zeile 4 vorkommt, in Zeile 5 eine andere ID steht und in Zeile 6 wieder die ID 13901 steht. Ansonsten tauchen doppelte IDs in der Ausgabe auf.

Außerdem bin ich davon ausgegangen, dass zu jeder ID, die ausgegeben werden soll, mindestens eine Zeile mit Namen existiert.

Ob die Annahmen, die ich getroffen habe, zutreffend sind, solltest du mit deinem Auftraggeber klären. Don't invent detail.

Letztendlich überspringt meine Lösung Zeilen ohne Namen lediglich.

Deine Annahmen waren so korrekt. Und Auftraggeber bin ich selbst :-)

Ich lerne Programmieren aus Interesse, so als Hobby.

Und Auftraggeber bin ich selbst

Dann sollte die Kommunikation ja größtenteils reibungslos funktionieren.

Ein anderes Problem?

Stell deine Frage

Ähnliche Fragen

0 Daumen
1 Antwort
0 Daumen
2 Antworten
0 Daumen
1 Antwort

Willkommen bei der Stacklounge! Stell deine Frage einfach und kostenlos

x
Made by a lovely community