Strings aus Datei heraussaugen und in Tabelle schreiben

Der Fehler ist, dass du nicht den AWK verwendest. :D

Das komplette AWK-Skript namens mw.awk, das dein Problem löst:
Code:
BEGIN { fcnt = 0; sum = 0; cnt = 0; }
/---END---/{
  FS=":"; 
  for ( i = 0; i < fcnt; i++ )
  {
    for ( j = 0; getline < fname[i] != -1; j++ )
    {
      if ( j < 14 ) continue;
      if ( j == 26 ) break;
      print $2 >"fileout.txt";
      sum += $2;
      cnt++;
    }
  }
  exit;
}
{ fname[fcnt++] = $1; print $1; next; }
END { if ( cnt > 0 ) printf("Anzahl: %d\nSumme: %d\nMittelwert: %d",cnt,sum,sum/cnt); }

Die Dateinamen für die auszulesenden Dateien befinden sich in einer Datei, deren Name als Parameter übergeben wurde; bei mir hieß sie files.txt. Als letzte Zeile in dieser Datei muss der String "---END---" stehen; dieser startet die eigentliche Verarbeitung.
$0 ist die Variable für die ganze Zeile, $1 ist das erste Feld in der Zeile, $2 das zweite usw. Wie bei argv[] in C.
Die Daten werden durch Separatoren getrennt die in der Variablen FS definiert werden können; bei mir zu Testzwecken war es der Doppelpunkt ':'.
Die eingelesenen Werte werden in die Datei "fileout.txt" geschrieben, aufsummiert und am Ende der Bearbeitung ausgegeben; als Anzahl, Summe und Mittelwert.

Der Aufruf erfolgt über die Kommandozeile:

gawk -f mw.awk files.txt

Den gawk findest du unter http://www.gnu.org/software/gawk/

Viel
Vergnügen
Vereth

:)
 
Zuletzt bearbeitet:
Um trotzdem mal auf deinen Code zu kommen, ich möchte manchmal auch ganz gerne was in einer Sprache hinbekommen, auch wenn es leichtere Lösungen dafür gibt.

Du solltest vor allem wie schon gesagt deinen Code besser Einrücken, das wird dir selber die Arbeit erleichtern, du wirst sehen.

Was für einen Fehler hast du denn, was sagt der Compiler ?

Was mir spontan auffällt ( Ich habe deinen Code gleich mal besser eingerückt):

Code:
for (j = 1 ; j <= 2300 , j++){
   
    if (inhalt[j] == "\n"){
        k++;
    }
    
    if (k == 3){
        if (inhalt [j] == "%"){
            fwrite(inhalt[566], 454 , 1, fp2);
        }
    }
}
Beim Vergleich mit "Zeichen" nur ein ' --> Also
Code:
if(Inhalt[j] == '\N')

Mich wundert ausserdem das du eine For-Schleife benutzt, die 2299 mal durchläuft, obwohl du nur bis hin zur 3ten Zeile überprüfsst, da wäre eine while-schleife besser geeignet.
Und das du auf die 3te Zeile überprüfst ob ein % Zeichen da ist, und dann einen erst viel späteren festen Wert in den anderen File-Pointer schreibst. Ist immer wenn ein % Zeichen in der Zeile auftritt diese Stelle die richtige?

Hoffe ich konnte ein bisschen helfen, wiegesagt, das mit den Tütelchen ist wichtig, ansonsten mal konkret den Fehler sagen.

Mfg Dragonate
 
Zuletzt bearbeitet:
Hallo nochmal

habe jetzt ein bissel was geändert und bekomme zwar eine Ausgabe aber da steht anscheinend nur drinn was gerade im Speicher ist...ich glaube strcat geht nicht.

Code:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char *argv[])
{
     FILE * fp;
     FILE * fp2;
     char c ;
   char string [10]  ;

 //    c = malloc (3);

  fp2 = fopen ("C:/test.txt", "a");
  fp = fopen ("C:/Programme/data/gr/pi0057.txt", "r");
 
   int k = 0;
   int l = 0;
   int ll = 0;
   int b = 0; 
   while ((c = fgetc(fp)) != EOF)
   {
         
         if (c == '\n')
         {k++;}
         if (k == 3)
         {
               if (c == '%')
               { 
                     l = 0;
              
                     if (l == 17)
                     {  
                           b = 1;
                           ll = 0;
                            }
                     }
               }
    l++;
    ll++; 
    if (b == 1 && c != ' ')
    {
 strcat(c,string);         

          }    
          
    else 
    {
         b = 0;
         }
   }
         
          
   
   
fwrite(string, 10, 1, fp2);
   fclose(fp2);


   if (fp == NULL) {
        int i;
   for ( i = 1 ; i <= 10000 ; i++ )    
     { printf("nejjjjjjjjjjjj!\n");     
} } else {
            int i;
   for ( i = 1 ; i <= 10000 ; i++ )    
     { printf("joooooooo!  ");  
      }   
      return 1;
   }
	
  return 0;

}
Danke für die Hilfe
Gruss
 
Hallo nochmal

habe jetzt ein bissel was geändert und bekomme zwar eine Ausgabe aber da steht anscheinend nur drinn was gerade im Speicher ist...ich glaube strcat geht nicht.
strcat geht schon - wenn man es mit Strings verwendet. Du hast dort als Zielstring ein Zeichen angegeben - das Programm müßte eigentlich abstürzen. Du mußt dort einen String (char-Array) angeben das genug Platz hat den Quellstring zusätzlich zum bereits vorhandenem Inhalt aufzunehmen.

Schalte die Warnungen deines Compilers ein! Und deine Einrückungen stimmen immer noch nicht.

Gruß
 
- Strings sind char-Arrays, die ein '\0'-Zeichen als Endekennung haben.
- Strings sollten sicherheitshalber immer mit einem str[0]='\0' o.ä. initialisiert werden.
- strcat ist eine Funktion, die zwei Strings als Übergabeparameter erwartet. Da du zeichenweise arbeitest, ist es für dein Zwecke ungeeignet.
- Wenn du dein Suchmuster gefunden hast, solltest du es entweder in einen Ergebnisstring kopieren ( str[i] = c; ), den du dann weiterverarbeitest und mit fputs oder fprintf (funktioniert wie printf, schreibt aber in eine Datei) in deine Ergebnisdatei schreibst (Anhängen des '\0'-Zeichens nicht vergessen), oder sofort mit fputc in deine Ausgabedatei kopierst (Zeilenumbrüche u.ä. nicht vergessen).
- Du schreibst
Code:
	l = 0;

	if (l == 17)
Weil l unmittelbar zuvor mit 0 initialisiert wird, ist die if-Abfrage immer falsch, weswegen die Variable b nie auf 1 gesetzt wird. Demzufolge kann auch weiter unten niemals der Zweig ausgeführt werden, in dem du das strcat 'mißbrauchst'.
- Du solltest dir angewöhnen, Dateizeiger sofort nach dem fopen auf NULL zu testen.
- Gewöhne dir bitte eine vernünftige Formatierung (Einrückungen etc.) an.
- Schreibe am besten noch hinter die Variablendeklarationen einen kurzen Kommentar, der einen Hinweis auf den Verwendungszweck liefert.
 
Hallo nochmal habe nachdem das alles nicht ging es einfach mal auf c sharp versucht... und siehe da... es geht.....
hier mein Code falls Jemand aud die Idee kommt es mal zu gebrauch...
Code:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;


namespace dateizufügen
{
    class Program
    {
        static void Main(string[] args)
        {
            int t = 0 , h = 0 , z = 0 ,e = 0;
           string summe,e1,h1,z1,t1 ;
            string array = "Position ; Art ; Serienstrang ; Parallelstrang ; Flaeche ; Bandabstand ; KS-I c0 ; Isc_Temp c1 ; Shockley _satt c01 ; Recombi_sat c02 ; R_parallel ; R_serie ; alfa ; beta ; b1 ; b2 ; b3 ";
            Byte[] array1, test;
           // string[] daten;
            string typ,serie,parallel,flaeche,gab,c0,c1,c01,c02,rs,rp,alfa,beta,b1,b2,b3;

         FileStream fs = File.OpenWrite("C:/constanten.csv");
         FileStream fs1 = File.OpenWrite("C:/test.txt");
         for (t = 0; t < 6; t++)
         {
             for (h = 0; h < 10; h++)
             {
                 for (z = 0; z < 10; z++)
                 {
                     for (e = 0; e < 10; e++)
                     {
                         e1 = Convert.ToString (e);
                         z1 = Convert.ToString (z);
                         h1 = Convert.ToString (h);
                         t1 = Convert.ToString (t);
                         summe = t1+h1+z1+e1;

                         if (summe == "5630")
                         {
                             break;
                         }
                         else
                         {

                             if (summe == "0000")
                             {

                             }
                             else
                             {
                                 //for (i = 0; i < 1000000; i++)
                                 //{
                                 //    test = i;
                                 //    if (test == 9999)
                                 //    {
                                 //     Console.Out.WriteLine("text  ," + summe + "");
                                 //    }
                                 //}


                                 string strfile = @"C:/Programme/resources/data/pi/de" + summe + ".txt";
                                 if (File.Exists (strfile))
                                 {

                                     string[] daten = File.ReadAllLines("C:/Programme/resources/data/pi/de" + summe + ".txt");
                                     typ = daten[3].Substring(33, 5) + ";";
                                     serie = daten[6].Substring(0, 5) + ";";
                                     parallel = daten[7].Substring(0, 5) + ";";
                                     flaeche = daten[10].Substring(0, 16) + ";";
                                     gab = daten[14].Substring(0, 16) + ";";
                                     c0 =  daten[15].Substring(0, 16) + ";";
                                     c1 = daten[16].Substring(0, 16) + ";";
                                     c01 = daten[17].Substring(0, 16) + ";";
                                     c02 = daten[18].Substring(0, 16) + ";";
                                     rs = daten[19].Substring(0, 16) + ";";
                                     rp = daten[20].Substring(0, 16) + ";";
                                     alfa = daten[21].Substring(0, 16) + ";";
                                     beta = daten[22].Substring(0, 16) + ";";
                                     b1 = daten[23].Substring(0, 16) + ";";
                                     b2 = daten[24].Substring(0, 16) + ";";
                                     b3 = daten[25].Substring(0, 16) + ";";

                                     array = array + "\n" + summe + ";" + typ + serie + parallel + flaeche + gab + c0 + c1 + c01 + c02 + rs + rp + alfa + beta + b1 + b2 + b3;

                                 }
                                 else
                                 {
                                     summe = summe + " ";
                                        
                                     test = new UTF8Encoding(true).GetBytes(summe);
                                     
                                     fs1.Write(test, 0, 5);
                                 }
                             }

                         }

                         

 
                     }
                 }
             }
         }

           // Console.Out.Write(array);
           array1 = new UTF8Encoding(true).GetBytes(array);
           fs.Write(array1 , 0, array.Length);

          // Console.Out.WriteLine("text," + array1 + "");
         //  Console.In.Read();
        }
    }
}


Danke an alles die mir geholfen haben haben

MFG
 
Zuletzt bearbeitet:
Zurück