# Probleme beim lesen aus einer Log-Datei undd dem schreiben in ein Array



## Dreamhacked (17. Okt 2011)

Hallo liebe Community,

ich bin neu hier.
ich habe leider ein kleines Problem beim auslesen von Log-Datein aus einer Telefonanlage.
Die Log-Datei ist so aufgebaut

40500;2391;10.08.2011;23:58:12;34
4629;629124;11.08.2011;00:12;61
theoretisch bis zu 118 weiteren Zeilen, da Log minütlich exportiert wird und nur ein ISDN angeschlossen ist.

40500 anrufende Nr.
2391 angerufene Nr.
10.08.2011 Datum des Anrufes
23:58:12 Zeitpunkt des Anrufes
34 Dauer des Anrufes in sec.

Nun sollen die Werte zwischen dem Semikolon in das Array ("Zeichenpruefen") geschrieben werden,
damit die Werte der anrufenden Nr. mit einer Tastatureingabe verglichen werden können.
Das klappt leider nicht.???:L
ich bekomme immer ein 





> exception in thread "main" java.lang.arrayIndexOutofboundsexception: 13 at telefon.main<telefon.java:55>




Wenn ich [JAVA=55]Zeichenpruefen[arrx][arry]=Integer.toString(zeichen);[/code]
auskommentiere läuft das Programm ohne Probleme, jedoch kommt keine Ausgabe, da ja kein Inhalt in dem Array.

Danke schonmal im voraus für die Hilfe.:toll:
kleine Info noch JDK ist 6u27

Gruß Stephan Fischer

P.S. Im Anhang schonmal der komplette Quelltext


```
import java.io.*;
public class telefon
{
  public static void main(String args[])
  {
    try
    {
      int zeichen=0;
      int arrsize=0;
      int arry=0;
      int arrx=0;
      BufferedReader reading = new BufferedReader(new InputStreamReader(System.in));
      FileOutputStream output = new FileOutputStream("auswertung.txt");
      FileInputStream input = new FileInputStream("log.txt");
      while((zeichen=input.read())!=-1)
      {
        if (zeichen==10)
        {
          arrsize++;
        }
      }
      input.close();
      FileInputStream in = new FileInputStream("log.txt");
      System.out.println("Telefonanlagen Log-Auswertung");
      System.out.println("");
      System.out.print("zu untersuchende Rufnummer eingeben: ");
      int eingabe=reading.read();
      System.out.println("");
      String[][] Zeichenpruefen= new String[arrsize][5];
      for (int i=0; i<arrsize; i++)
      {
         Zeichenpruefen[i][0]="";
         Zeichenpruefen[i][1]="";
         Zeichenpruefen[i][2]="";
         Zeichenpruefen[i][3]="";
         Zeichenpruefen[i][4]="";
      }//Zeichenpruefen initsialisieren
      while((zeichen=in.read())!=-1)
      {
        if (zeichen==59)//ist ;
        {
          zeichen=44;// ; in , umwandeln
          arry++;//nächstes Feld im Array
        }
        else if (zeichen==10)//Zeilenumbruch
        {
          arry=0;// 1. Feld im Array
          arrx++;// nächste Zeile im Array
        }
        output.write(zeichen);
        if (zeichen!=59)
        {
          if (zeichen!=10)
          {
            Zeichenpruefen[arrx][arry]=Integer.toString(zeichen);//zeichen in String umwandeln und in Array schreiben
          }
        }
      }
      for(int j=0;j<arrsize;j++)
      {
        if (Zeichenpruefen[j][0]==Integer.toString(eingabe))
        {
          System.out.println("Von: "+Zeichenpruefen[j][0]+" An: "+Zeichenpruefen[j][1]+
          "Am: "+Zeichenpruefen[j][2]+" Um: "+Zeichenpruefen[j][3]+" Dauer: "+Zeichenpruefen[j][4]);
        }
      }
      in.close();
      output.close();
    }
    catch(FileNotFoundException e)
    {
      System.out.print("Datei nicht gefunden:"+e.toString() );
    }
    catch(IOException e)
    {
      System.out.print("Lesefehler..."+e.toString() );
    }
  }
}
```


----------



## Firephoenix (17. Okt 2011)

Hier mal ein kleines Beispiel,
vielleicht kannst du einen Teil davon gebrauchen


```
String line;
        ArrayList<Integer> anruferNummern = new ArrayList<Integer>();
        BufferedReader in; //... initialisieren
        while ( ( line = in.readLine() ) != null )
        {
            // Teststring, der sonst von dem Reader eingelesen wird
            String test = "40500;2391;10.08.2011;23:58:12;34";
            // Gesplitteter String
            String[] split = test.split( ";" );
            // Arraylänge prüfen, sonstige fehler vorher abfangen
            // ...
            try
            {
                // Parsen und ausgeben
                int anrufer = Integer.valueOf( split[0] );
                int angerufen = Integer.valueOf( split[1] );
                DateFormat df1 = DateFormat.getDateTimeInstance();
                Date anrufDatum = df1.parse( split[2] + " " + split[3] );
                int sekundenDauer = Integer.valueOf( split[4] );
                System.out.println( "Anrufer: " + anrufer );
                System.out.println( "Angerufen: " + angerufen );
                System.out.println( "Datum: " + anrufDatum );
                System.out.println( "Dauer: " + sekundenDauer + "s" );
                // Nummer merken für weitere prüfung
                anruferNummern.add( anrufer );
            }
            catch ( Exception e )
            {
                // Exception (z.b. beim parsen) behandeln
                // ..
            }
        }
```

beachte, dass ich die Schleife zum lesen der Datei nur skizziert habe, in der Methode wird auch nicht mit dem String line sondern einem Teststring gearbeitet und das Datum habe ich einfach mal zusammenformatiert.
Außerdem werden keine Fehler wie Leere Zeilen oder Falscheingaben etc abgefangen.
Gruß


----------



## Dreamhacked (18. Okt 2011)

hat leider nicht funktioniert.

meine Kollegen haben heute morgen gemeint, das da ein Problem mit meiner arrx-Variablen gibt,
welche ja die Anzahl der Zeilen repräsentiert, welche aus dem Array ausgelesen werden sollen.
Desweiteren habe ich vergessen zu erwähnen, dass das Array 2D sein sol, also sozusagen eine Tabelle repräsentieren soll.
Ihr hättet mir sehr geholfen, wenn nur der Fehler aus zeile 55 verschwinden würde.


> exception in thread "main" java.lang.arrayIndexOutofboundsexception: 13 at telefon.main<telefon.java:55>



gruß


----------



## Dreamhacked (18. Okt 2011)

Ich nochmal,

das Problem ist behoben.
hier der funktionierende Code.
das Array war eins zu klein.
das funktioniert jetzt.
[JAVA=29]String[][] Zeichenpruefen= new String[arrsize+1][5];[/code]
Nur kann ich es nicht ausgeben.
Die Abfrage scheitert an der Eingabe der Tastatur.
so funktionert die Ausgabe:

[JAVA=61]        //if (Zeichenpruefen[j][0]==eingabe)
        //{
          System.out.println("Von: "+Zeichenpruefen[j][0]+" An: "+Zeichenpruefen[j][1]+" Am: "+Zeichenpruefen[j][2]+" Um: "+Zeichenpruefen[j][3]+" Dauer: "+Zeichenpruefen[j][4]);
       // }[/code]

Weis jemand, woran es liegen könnte?
das speichern in das Array funktioniert.
Ausgabe ja auch, nur habe ich das Problem, dass die Bedingung nie erfüllt ist.

gruß Stephan


```
import java.io.*;
public class telefon
{
  public static void main(String args[])
  {
    try
    {
      int zeichen=0;
      int arrsize=0;
      int arry=0;
      int arrx=0;
      BufferedReader reading = new BufferedReader(new InputStreamReader(System.in));
      FileOutputStream output = new FileOutputStream("auswertung.txt");
      FileInputStream input = new FileInputStream("log.txt");
      while((zeichen=input.read())!=-1)
      {
        if (zeichen==10)
        {
          arrsize++;
        }
      }
      input.close();
      FileInputStream in = new FileInputStream("log.txt");
      System.out.println("Telefonanlagen Log-Auswertung");
      System.out.println("");
      System.out.print("zu untersuchende Rufnummer eingeben: ");
      String eingabe=reading.readLine();
      System.out.println("");
      String[][] Zeichenpruefen= new String[arrsize+1][5];
      for (int i=0; i<arrsize; i++)
      {
         Zeichenpruefen[i][0]="";
         Zeichenpruefen[i][1]="";
         Zeichenpruefen[i][2]="";
         Zeichenpruefen[i][3]="";
         Zeichenpruefen[i][4]="";
      }//Zeichenpruefen initsialisieren
      while((zeichen=in.read())!=-1)
      {
        if (zeichen==59)//ist ;
        {
          zeichen=44;// ; in , umwandeln
          arry++;//nächstes Feld im Array
        }
        else if (zeichen==10)//Zeilenumbruch
        {
          arry=0;// 1. Feld im Array
          arrx++;// nächste Zeile im Array
        }
        output.write(zeichen);
        if (zeichen!=44)
        {
          if (zeichen!=10)
          {
              Zeichenpruefen[arrx][arry]=Zeichenpruefen[arrx][arry]+(char)zeichen;//zeichen in String umwandeln und in Array schreiben
          }
        }
      }
      for(int j=0;j<arrsize;j++)
      {
        if (Zeichenpruefen[j][0]==eingabe)
        {
          System.out.println("Von: "+Zeichenpruefen[j][0]+" An: "+Zeichenpruefen[j][1]+" Am: "+Zeichenpruefen[j][2]+" Um: "+Zeichenpruefen[j][3]+" Dauer: "+Zeichenpruefen[j][4]);
        }
      }
      in.close();
      output.close();
    }
    catch(FileNotFoundException e)
    {
      System.out.print("Datei nicht gefunden:"+e.toString() );
    }
    catch(IOException e)
    {
      System.out.print("Lesefehler..."+e.toString() );
    }
  }
  // Ende Methoden
}
```


----------



## Dreamhacked (31. Okt 2011)

Problem gelöst!

hier der funktionierende Quelltext.


```
import java.io.*;
public class telefon
{
  public static void main(String args[])
  {
    try
    {
      int zeichen=0;
      int arrsize=0;
      int arry=0;
      int arrx=0;
      BufferedReader reading = new BufferedReader(new InputStreamReader(System.in));
      FileOutputStream output = new FileOutputStream("auswertung.txt");
      FileInputStream input = new FileInputStream("log.txt");
      while((zeichen=input.read())!=-1)
      {
        if (zeichen==10)
        {
          arrsize++;
        }
      }
      input.close();
      FileInputStream in = new FileInputStream("log.txt");
      System.out.println("Telefonanlagen Log-Auswertung");
      System.out.println("");
      System.out.print("zu untersuchende Rufnummer eingeben: ");
      String eingabe=reading.readLine();
      System.out.println("");
      String[][] Zeichenpruefen= new String[arrsize+1][5];
      for (int i=0; i<=arrsize; i++)
      {
         Zeichenpruefen[i][0]="";
         Zeichenpruefen[i][1]="";
         Zeichenpruefen[i][2]="";
         Zeichenpruefen[i][3]="";
         Zeichenpruefen[i][4]="";
      }//Zeichenpruefen[][] leeren
      while((zeichen=in.read())!=-1)
      {
        if (zeichen==59)//ist ;
        {
          zeichen=44;// ; in , umwandeln
          arry++;//nächstes Feld im Array
        }
        else if (zeichen==10)//Zeilenumbruch
        {
          arry=0;// 1. Feld im Array
          arrx++;// nächste Zeile im Array
        }
        else
        {
          Zeichenpruefen[arrx][arry]=Zeichenpruefen[arrx][arry]+(char)zeichen;//zeichen in String umwandeln und in Array schreiben
        }
        output.write(zeichen);
      }
      for(int j=0;j<arrsize;j++)
      {
        if (Integer.parseInt(Zeichenpruefen[j][0])==Integer.parseInt(eingabe))
        {
        System.out.println("Von: "+Zeichenpruefen[j][0]+" An: "+Zeichenpruefen[j][1]+" Am: "+Zeichenpruefen[j][2]+" Um: "+Zeichenpruefen[j][3]+" Dauer: "+Zeichenpruefen[j][4]);
        }
      }
      in.close();
      output.close();
    }
    catch(FileNotFoundException e)
    {
      System.out.print("Datei nicht gefunden:"+e.toString() );
    }
    catch(IOException e)
    {
      System.out.print("Lesefehler..."+e.toString() );
    }
  }
  // Ende Methoden
}
```
[JAVA=29]String[][] Zeichenpruefen= new String[arrsize+1][5];[/code]
Hier hat das "+1" gefehlt, deswegen der Array out of Bound Fehler
[JAVA=58]if (Integer.parseInt(Zeichenpruefen[j][0])==Integer.parseInt(eingabe))[/code]
Der String "Zeichenpruefen[j][0]" und "eingabe" muss in ein Integer umgewandelt werden, damit sie verglichen werden können.

MFG Stephan

P.S. danke an die die mir geholfen haben...


----------

