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

Dreamhacked

Mitglied
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.:oops:

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

Java:
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() );
    }
  }
}
 
F

Firephoenix

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

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

Mitglied
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ß
 
Zuletzt bearbeitet:

Dreamhacked

Mitglied
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

Java:
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
}
 
Zuletzt bearbeitet:

Dreamhacked

Mitglied
Problem gelöst!

hier der funktionierende Quelltext.

Java:
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...
 
Zuletzt bearbeitet:

Neue Themen


Oben