Methode, für dateiverarbeitungen

anfjoe

Mitglied
Hallo Liebe Java experten!

Ich versuche eine Methode dat2StF zu Programmieren, mit der die CSV- Datensätze einer Datei mit Namen dsn zeichenorientiert eingelesen werden und als Komponenten eines Stringfeldes u[] gespeichert werden mit dem prototyp: static Sting[] dat2StF(String dsn)

Java:
static String[] dat2StF(String dsn)throws IOException{

           int i=1,n;
           String h;
           String u[];

           FileReader px1=new FileReader("dsn.txt");
           BufferedReader brx1=new BufferedReader(px1);
           h= brx1.readLine();

           while(h!=null)
           {int z=0;
           u=h.split(";");

             if(u==null){
             System.out.println(i +".Datensatz falsch:"+ h);
             }
             else

             {

             u=brx1.readLine();
             i++;
             z++;
             }
          }

         brx1.close();
         
         return u;
     }

soweit bin ich gekommen.. jeder zeigt der compiler jedes mal u have not been initialized .. was ich nicht so ganz nachvollziehen kann.

liebe grüße anfjoe!
 

Paddelpirat

Bekanntes Mitglied
Wenn dein
Code:
h
null ist, dann wird die Schleife nicht durchlaufen und dein
Code:
u
wird nicht initialisiert.
 

ARadauer

Top Contributor
ich bekomm den fehler
Type mismatch: cannot convert from String to String[]

weil du in zeile 22 einem array einen string zuweist..

du kommst aus der c oder großrechner ecke oder?
Ich würde mir sprechende Variablen und Methodne angewöhnen... was ist dat2StF, u, z, h, n???
 

anfjoe

Mitglied
u[] ist für den fertigen string feld.. also rückgabewert der methode.. und h ist ein string für den speicher einer zeile dieser dateiauslese...z und n muss ich wegnehmen...Also mit c hab ich noch nie programmiert xD ich bin noch'n anfänger.. also die aufgabe ist einfach nur eine methode mit dem obengenannten prototyp der einfach CSV datensätze einer datei einzulesen und als Komponenten eines Stringfeldes u speichern.. muss ich also statt u=brx1.readLine(); ->

schleifenzähler i=0 dek. und in.
u=brx1.readLine();

???
 

anfjoe

Mitglied
Java:
 static String[] dat2StF(String dsn)throws IOException{

           int i;
           String h;
           String u[];

           FileReader px1=new FileReader("dsn.txt");
           BufferedReader brx1=new BufferedReader(px1);
           i=1;
           h= brx1.readLine();
           int z=0;
           while(h!=null)
           {
           u=h.split(";");

             if(u==null){
             System.out.println(i +".Datensatz falsch:"+ h);
             }
             else

             {

             h=brx1.readLine();
             i++;
             z++;
             }
          }

         brx1.close();
         
         return u;
     }

jetzt sag er mir nur u have not been initialized ??
 

Paddelpirat

Bekanntes Mitglied
Weil du wie vorher
Code:
u
nur in der while-Schleife initialisierst. Wenn diese aber gar nicht aufgerufen wird, weil
Code:
h
den Wert null hat, dann kannst du
Code:
u
am Ende der Methode nicht zurückgeben.
 

anfjoe

Mitglied
@ paddelpirat: Ja ich kann das auch nachvollziehen das u nicht initalisiert wird wenn h = 0 ist aber wie kriege ich die ausgelesene strings in u gespeichert??
 

anfjoe

Mitglied
Ich hab da noch folgendes Problem.. die Aufgabe heißt jetzt in der selben klasse die methode dat2Stf() aufzurufen, dann wird mit dem Stringfeld u[], das ihr Ergebnis ist, der konstruktor einer anderen klasse aufgerufen..

Ich verstehe jetzt nicht so ganz was ich der methode übergeben muss ?

das aufrufen der Methode geschieht bei mir in im else block

Java:
 else{

       u=dat2StF();
       a= new Mat(u);
      }

no arguments.. was muss denn da rein :(
 

anfjoe

Mitglied
ok ich habe jetzt folgendes getan.. ich habe in die klammer "dsn.txt" reingeschrieben und der compiler streikt nicht.. ob das wohl richtig ist was ich getan habe ?
 

Paddelpirat

Bekanntes Mitglied
Deine Methode dat2StF erwartet beim Aufruf einen String. Dieser String heißt bei dir in der Methode dsn. Wahrscheinlich sollst du die Methode so aufrufen (wie du ja getan hast):
Code:
u = dat2StF("dsn.txt");
Dies macht aber nur Sinn, wenn du in der Methode auch den String Namens dsn weiter verwendest. In deinem Fall würde der String dsn ein Dateiname sein. Also musst du den FileReader damit füttern. Also anstatt nun
Code:
FileReader px1=new FileReader("dsn.txt");
aufzurufen. Schreibst du
Code:
FileReader px1=new FileReader(dsn);
. Dadurch ist deine Methode deutlich flexibler, da du beim Aufrufen der Methode sagst, welche Datei geöffnet werden soll.
 

anfjoe

Mitglied
Super :) danke für die hilfe!

ich hätte da noch ne frage! Also ich musste jetzt eine Methode programmieren der Mat2Dat() heißt. Mit dieser Methode kann der Anwender eine Csv string eingeben und diese wird in eine datei namens dsnA geschrieben der prototyp dieser methode:
void mat2Dat(String dsnA)

so das hab ich nun programmiert und jetzt heißt die aufgabe das in einer anwendungsdatei wo matrizen miteinander verrechnet werden (mul,skl,add,sub) die ergebnis matrix auch nun in eine datei geschrieben werden soll. kann ich nicht die methode mat2dat() dafür verwenden ?
 

Paddelpirat

Bekanntes Mitglied
Der letzte Schritt klingt so, als solltest du das Ergebnis aus einer Datei einlesen und in einer anderen Datei schreiben, oder habe ich das missverstanden? Dann wäre es ja eigentlich eine Kombination aus deinen zwei Methoden (die erste zum einlesen, die zweite zum schreiben).
 

anfjoe

Mitglied
Also ich habe folgendes Problem noch..

hier ist die Anwendeungsklasse:

Java:
import java.io.*;

class MatAnw
{public static void main (String args[])

   {int ex;
    Mat a;

    int p=1;
    do
    {
      System.out.println("Matrizeneingabe");
      System.out.println("-1 Normale Variante");
      System.out.println("-2 CSV Variante");
      ex=IO1.einint();

       if (ex==1 || ex==2)
       {
         p=2 ;
        }
        else
        {
         System.out.println("Falsche Eingabe!!!");
        }
    } while (p==1);

    a=matEin(ex);
    menue(ex, a);
    System.out.println(" Ende des Programms");
   }


   static void menue(int ex,Mat a)
   {
    int f=1;
    int h;
    double w;
    Mat b;
    Mat c;


    do
    {
      System.out.println("\n -1 Matrizenaddition");
      System.out.println("-2 skalare Multiplikation");
      System.out.println("-3 Matrizenmultiplikation");
      System.out.println("-4 Ende");
      h=IO1.einint();

      switch(h)
      {

        case 1 : System.out.println("Bitte Dateiname der zuerstellenden Datei eingeben:");
                 String dat1=IO1.einstring();
                 b=matEin(ex);
                 c=a.matAdd(b);

                switch (c.ctr)
                {
                  case 1 :   a.matAus();
                             System.out.println("\n + \n") ;
                             b.matAus();
                             System.out.println("\n = \n");
                             c.matAus();

                            break;
                  case -1 : System.out.println("\nFehler : -1\nMatrizenaddition nicht möglich!!! ");
                            System.out.println("Zeilen- und/oder Spaltenanzahl nicht identisch\n");
                            break;
                  default:  System.out.println(":)");

                }

                break;
        case 2 : System.out.println("Skalar Eingabe");
                 w=IO1.eindouble();
                 c=a.matSkm(w);
                 a.matAus();
                 System.out.println("\n * \n") ;
                 System.out.println("\n "+w+" \n") ;
                 System.out.println("\n = \n");
                 c.matAus();
                 break;

        case 3 : System.out.println("Bitte Dateiname der zuerstellenden Datei eingeben:");
                 String dat2=IO1.einstring();
                 b=matEin(ex);
                 c=a.matMul(b);
                switch (c.ctr)
                {
                  case 1 :  a.matAus();
                            System.out.println("\n * \n") ;
                            b.matAus();
                            System.out.println("\n = \n");
                            c.matAus();
                            break;
                  case -2 : System.out.println("\nFehler: -2\nmultiplikation nicht möglich! " );
                            System.out.println( "Spaltenanzahl von M1 ungleich mit Zeilenanzahl von M2\n");
                            break;
                  default:  System.out.println(":)");

                }

                break;

        case 4 : f=0;
                 break;
        default: System.out.println("falsche Eingabe!!!!");
                 break;

       }
     }
     while (f==1);

   }


    static Mat matEin(int ex)
   {
        int i;
        int j;
        Mat a=null;
        String u[];

     if (ex==1)
     {
       a=new Mat();
       System.out.println("Eingabe der Zeilenanzahl");
       a.n=IO1.einint();
       System.out.println("Eingabe der Spaltenanzahl");
       a.m=IO1.einint();
       System.out.println("Eingabe der Matrixelemente");
       a.k=new double[a.n][a.m];

      for (i=0;i<a.n ;i++ )
      {
          for (j=0;j<a.m ;j++ )
          {
             System.out.println("["+(i+1)+"] ["+(j+1)+"]");
             a.k[i][j]=IO1.eindouble();
           }

       }

     }
     else
     { if(ex==2){
        do
        {
          System.out.println("Eingabe der Zeilenanzahl");
          i=IO1.einint();
          u=new String[i];

                for (i=0;i<u.length ;i++ )
                {
                      System.out.println("Bitte "+(i+1)+". Zeile eingeben: Werte durch ; trennen!");
                      u[i]=IO1.einstring();
                 }

         a= new Mat(u);

         if (a.ctr==-4)
         {
          System.out.println("\nFehler : -4 \nSpaltenanzahl weicht von der , der ersten Zeile ab!!");
          System.out.println("Bitte neu eingeben\n");
         }

         if (a.ctr==-3)
         {
          System.out.println("\nFehler : -3 !!!\nWerte außerhalb des Definitionsbereiches gefunden! ");
          System.out.println("Bitte neu eingeben\n");
         }

        }
        while (a.ctr!=1);


      }
      //wenn ex==3!!

       else{

       u=dat2StF("dsn.txt");
       a= new Mat(u);
      }
     }

    return a;
   }
   
    //4a) Methode dat2StF
   
    static String[] dat2StF(String dsn){

           int i;
           String h;
           String u[]=null;
           try{
           FileReader px1=new FileReader("dsn");
           BufferedReader brx1=new BufferedReader(px1);
           i=1;
           h= brx1.readLine();
           int z=0;
           while(h!=null)
           {
           u=h.split(";");

             if(u==null){
             System.out.println(i +".Datensatz falsch:"+ h);
             }
             else

             {

             h=brx1.readLine();
             i++;

             }
          }

           brx1.close();

           return u;
           }
           catch(IOException ex1)
           {
             System.out.println("Eingabedatei nicht vorhanden"+ ex1.getMessage());
           }
           return null;
     }

   /* //Methode Ergebnis matrix --> Datei
    void MatInDa(String dat1) throws IOException{

     int p=0;
     int n= n;
    String pz;
     System.out.println("Bitte Dateiname der zuerstellenden Datei eingeben:");
                 String dat=IO1.einstring();
     FileWriter px1=new FileWriter(dat);
     PrintWriter brx1= new PrintWriter(px1);

     for(int j=0; j<n; j++){
      for(int i=0; i<n; i++){
      p++;

     pz=String.valueOf(c[j][i]);
     brx1.println(pz);
     }
     }

     brx1.close();
     System.out.println("Matrix in"+ dat+" geschrieben!");
    }
     
     
        */


   }

Und hier die Mat klasse dazu

Java:
import java.io.*;

class Mat
{int n ;            /*Zeilenzahl*/
 int m ;            /*Spaltenzahl*/
 int ctr=1;         /*Kontrollfeld*/
 double k[][];      /*Koeffizienten der Matrix*/


  void matAus()     /*Ausgabemethode*/
  {int i;
   int j;
   String s=" ";
   String l=" ";
   String v;

    for (i=0;i<n ;i++ )
    {
        for (j=0;j<m;j++ )
        {
           v=String.valueOf(k[i][j]);
           s=s+l+v;
         }
     System.out.println (s);
     s=" ";
    }
  }

 Mat matAdd(Mat b)
 {Mat c;
  int i ;
  int j;
   boolean ok=false;

    if (b.n==n && b.m==m)
    {
      ok=true;
     }

     c=new Mat();

     if (ok==true)
     {c.k=new double [n][m];
      c.n=n ;
      c.m=m  ;

       for (i=0;i<n ;i++ )
       {
         for (j=0;j<m ;j++ )
         {
           c.k[i][j]=k[i][j]+b.k[i][j] ;
          }
       }
     }
     else
     {
       c.ctr=-1;
      }
  return c;

 }


 Mat matSkm (double w)
 {int i ;
  int j;
  Mat c;

    c=new Mat();
    c.k=new double [n][m];
    c.n=n ;
    c.m=m  ;

       for (i=0;i<n ;i++ )
       {
             for (j=0;j<m ;j++ )
             {
                c.k[i][j]=k[i][j]*w;
              }
       }

   return c;
  }

  Mat matMul(Mat b)
  {Mat c;
   int i ;
   int j;
   int v;
    boolean ok=false;


     if (m==b.n)
     {
      ok=true;
     }

     c=new Mat();

     if (ok==true)
     {c.k=new double [n][b.m];
      c.n=n ;
      c.m=b.m  ;

      for (i=0;i<n ;i++ )
      {
           for (j=0;j<b.m ;j++ )
           {
               for (v=0;v<m ;v++ )
               {
                  c.k[i][j]+= k[i][v]*b.k[v][j];
                }
            }
      }

     }
     else
     {
      c.ctr=-2 ;
     }
     return c;
  }

  Mat()          /*StandardKonstruktor*/
  {

   }

  Mat(String u[])
  {
     int i;
     int j;
     String v[];
     String w[][];


       n=u.length;
       v=u[0].split(";");
       m=v.length;
       w=new String[n][m];
       k=new double [n][m];

             for (j=0;j<m ;j++ )
             {
                w[0][j]=v[j];
              }

             for (i=1;i<n;i++ )
             {
                  v=u[i].split(";");
                  if (v.length==m)
                  {
                     for (j=0;j<m ;j++ )
                     {
                        w[i][j]=v[j];
                      }
                   }
                   else
                   {
                      ctr=-4;
                      k=null;
                      break;
                    }
              }


     if (ctr!=-4)
     {


         for (i=0;i<n;i++ )
         {
             for (j=0;j<m ;j++ )
             {
                try
                {
                    k[i][j]=Double.parseDouble(w[i][j]);
                 }
                catch (NumberFormatException ex1)
                {
                    ctr=-3;
                    k=null;
                    break;
                 }

              }

             if (ctr==-3)
             {
                break;
              }
          }

      }



  }
  
   void mat2Dat(String dsnA) throws IOException{

    int p=0, n;
    String pz;
    
     FileWriter pa1=new FileWriter("dsnA.txt");
     PrintWriter pw1= new PrintWriter(pa1);
     System.out.println("Bitte die Zeilenanzahl der Matrix eingeben:");
     n=IO1.einint();
     for(int i=0; i<n; i++){
      p++;
     System.out.println("Bitte die"+ p +".te Zeile füllen und Koeffizienten mit Semikolon trennen!");
     pz=IO1.einstring();
     pw1.println(pz);
     }
     pw1.close();
     System.out.println("Matrix in dsnA geschrieben!");
   }
  

}

Und jetzt muss in der Anwendungsklasse jede ergebnismatrix einer rechenart in eine zeichenorientierte datei geschrieben werden und der betreffende anwender darf am anfang vor der rechnung ein dateinamen eingeben.. jetzt weiß ich nicht ob ich eine methode programmieren soll oder ob ich die mat2Dat() anwenden kann oder sonst was.. ich komme hier nicht weiter.. ich bin jeden sehr dankbar der mit weiter hilft ..
 

Paddelpirat

Bekanntes Mitglied
Mag mich da gerade nicht ganz durchwühlen, aber nochmal zu dem Teil von vorher:

Code:
FileReader px1=new FileReader("dsn");
Nimm da mal die Anführungszeichen raus. Du willst ja nicht aus der Datei "dsn" lesen, sondern aus der Datei die du über die Variable (den String) mit Namen dsn übergibst.

Edit und hier:

Java:
void mat2Dat(String dsnA) throws IOException{
 
    int p=0, n;
    String pz;
    
     FileWriter pa1=new FileWriter("dsnA.txt");

schreibst du du:

Java:
void mat2Dat(String dsnA) throws IOException{
 
    int p=0, n;
    String pz;
    
     FileWriter pa1=new FileWriter(dsnA);

Beim Aufruf machst du dann so etwas wie:
Code:
mat2Dat("dsnA.txt");
Du übergibst also einen Pfad (als String). Könnte z.B. auch so aussehen:
Code:
mat2Dat("C://Programme/blablubb/dsnA.txt");
 
Zuletzt bearbeitet:

anfjoe

Mitglied
Wieso gibt mir diese methode nichts zurück ?? ich verstehe das nicht so ganz

Java:
   Mat matTransp()
  { int i,j;
    Mat a, x;
    a=new Mat();
    x=new Mat();
    for(i=0;i<a.n;i++)
    {
        for(j=0;j<a.m;j++)
        {

        x.k[j][i]=a.k[i][j];

        }
    }

   return x;
   }
 

Paddelpirat

Bekanntes Mitglied
Na dann schau dir doch mal deinen tollen Mat-Konstruktor an. Der macht doch gar nichts. Was für einen Wert sollte da z.B.
Code:
a.n
haben, den du in deinen for-Schleifen abfragst?
 

anfjoe

Mitglied
Das hab ich nochmal korrigiert
der gibt schreibt mir die matrix mit lücken in eine datei und ausgeben tut der nichts.. hab ich was in der methode falsch programmiert ?

Java:
   Mat matTransp()
  { int i,j;
    Mat x;
    x=new Mat();
    x.k=new double[m][n];


    for(i=0;i<m;i++)
    {
        for(j=0;j<n;j++)
        {

        x.k[j][i]=k[i][j];

        }

    }

   return x;
   }
 
M

Marcinek

Gast
Wenn du gar keine Idee an dieser Stelle hast, dann schlage ich vor nochmal in die Bücher zu gehen.

Die Sachen, die du hier als Aufgaben hast sind sehr trivial und bergen nur wenig pot. für Fehler.

Ich gehe davon aus, dass du nicht debuggen kannst. Aber in den meisten Fällen kann mit mit system.out.print() viele Fehler lokalisieren.

Mal ein Konzept auf einem Blatt papier malen. Bisschen mehr googlen. Glaubst du, dass du der erste bist, der eine Matrixaufgabe lösen muss?

Eventuell mal mit Komlitonen sich hinsetzten und die Aufgaben besprechen. Oder Nachhilfe organiseren.
 

Neue Themen


Oben