# Methode, für dateiverarbeitungen



## anfjoe (14. Apr 2012)

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)


```
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 (14. Apr 2012)

Wenn dein 
	
	
	
	





```
h
```
 null ist, dann wird die Schleife nicht durchlaufen und dein 
	
	
	
	





```
u
```
 wird nicht initialisiert.


----------



## ARadauer (14. Apr 2012)

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 (14. Apr 2012)

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 (14. Apr 2012)

```
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 (14. Apr 2012)

Weil du wie vorher 
	
	
	
	





```
u
```
 nur in der while-Schleife initialisierst. Wenn diese aber gar nicht aufgerufen wird, weil 
	
	
	
	





```
h
```
 den Wert null hat, dann kannst du 
	
	
	
	





```
u
```
 am Ende der Methode nicht zurückgeben.


----------



## anfjoe (14. Apr 2012)

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


----------



## Paddelpirat (14. Apr 2012)

Versuchs mal mit 
	
	
	
	





```
String u[] = null;
```
, statt 
	
	
	
	





```
String u[];
```


----------



## anfjoe (14. Apr 2012)

wow  das hat jetzt geklappt.. aber warum hats geklappt??


----------



## Paddelpirat (14. Apr 2012)

Weil du jetzt 
	
	
	
	





```
u
```
 mit 
	
	
	
	





```
null
```
 initialisiert hast.


----------



## anfjoe (14. Apr 2012)

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


```
else{

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

no arguments.. was muss denn da rein


----------



## anfjoe (14. Apr 2012)

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 (14. Apr 2012)

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): 
	
	
	
	





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





```
FileReader px1=new FileReader("dsn.txt");
```
 aufzurufen. Schreibst du 
	
	
	
	





```
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 (14. Apr 2012)

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 (14. Apr 2012)

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


----------



## Marcinek (14. Apr 2012)

Wenn diese Funktion deine Anforderung erfüllt, dann ja.


----------



## anfjoe (14. Apr 2012)

Also ich habe folgendes Problem noch..

hier ist die Anwendeungsklasse:


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


```
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 (14. Apr 2012)

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


```
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:


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

schreibst du du:


```
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: 
	
	
	
	





```
mat2Dat("dsnA.txt");
```
Du übergibst also einen Pfad (als String). Könnte z.B. auch so aussehen: 
	
	
	
	





```
mat2Dat("C://Programme/blablubb/dsnA.txt");
```


----------



## anfjoe (16. Apr 2012)

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


```
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 (16. Apr 2012)

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. 
	
	
	
	





```
a.n
```
 haben, den du in deinen for-Schleifen abfragst?


----------



## anfjoe (16. Apr 2012)

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 ? 


```
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;
   }
```


----------



## Marcinek (16. Apr 2012)

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.


----------

