# Buchstaben zählen aus txt Datei



## mangrove (30. Mai 2005)

Hallo!

Ich würde gerne wissen wie man Buchstaben aus einer txt Datei zählt und die Häufigkeit dieser angibt!

Ich habe folgendes Script - irgenwie zeigt er mir jedoch folgende Fehler an:


```
import java.io.*;

public class wievieleBuchstaben {
    public static void main (String[] args) throws IOException {
        
    	String nameEingabedatei;
    	String zeile;
    	String aktuellesToken;
    	File eingabedatei;
    	FileReader fr;
    	BufferedReader br;
    
    
      	nameEingabedatei = "HHGTTG.txt";
      	//Anzahl der Worte ermitteln
      	System.out.println("Inhalt von "+nameEingabedatei);
      	eingabedatei = new File(nameEingabedatei);
      	fr = new FileReader(eingabedatei);
      	br = new BufferedReader(fr);
      	zeile=br.readLine();
        
        //BufferedReader eingabepuffer = new BufferedReader(new InputStreamReader(System.in));
        //String zeile = eingabepuffer.readLine();
        analyse (zeile);
    }

    public static void analyse(String s) {
        byte[] text = new byte[200];
        int[] anzahl = new int[26];
        int i;
        text = s.getBytes();
        for (i = 0; i < text.length; i++) 
            if (text[i]>90) text[i]-=32;         // Alles nach Großbuchstaben umwandeln
        for (i = 0; i < text.length; i++) 
            anzahl[(text[i]-65)]++;              // und jetzt zählen ;-)
        for (i = 0; i < 26; i++) 
            System.out.println((char) (i+65) + ": " + anzahl[i] + "\t" + stern(anzahl[i]));       // Ergebnis ausgeben
    }

    public static String stern(int anzahl) {
        String s = "";
        for (int i = 0; i<anzahl; i++) s+="*";
        return s;
    }
}
```


java.lang.ArrayIndexOutOfBoundsException
	at test.wievieleBuchstaben.analyse(wievieleBuchstaben.java:45)
	at test.wievieleBuchstaben.main(wievieleBuchstaben.java:34)
Exception in thread "main" 




Bin für jeden Ratschlag sehr dankbar!


----------



## mic_checker (30. Mai 2005)

mangrove hat gesagt.:
			
		

> ```
> for (i = 0; i < text.length; i++)
> if (text[i]>90) text[i]-=32;         // Alles nach Großbuchstaben umwandeln
> for (i = 0; i < text.length; i++)
> ...



guck dir mal die zeilen an, wahrscheinlich schmeisst er da die exception, da du versuchst auf elemente des arrays zuzugreifen die nicht existieren...


----------



## mangrove (30. Mai 2005)

DANKE - hört sich den Fehlermeldungen entsprechend an!

Aber wie kann ich das umgehen, sodass ich auch größere TXT files bearbeiten kann???

Paul


----------



## mic_checker (30. Mai 2005)

kannst ja mit BufferedReader einlesen und guckst dann zeile für zeile durch welche Buchstaben drin sind. Dabei betrachtest du den String, nicht ein byte-Array. 

Also String zeichenweise durchgehen (charAt(...)) und gucken was für Buchstabe drin ist....


----------



## mangrove (30. Mai 2005)

Leider bin ich ziemlicher Anfänger und brauche die Funktion aber!

Dürfte ich dich bitten mir das kurz zu tippen sodass es funktioniert?

 :?: 

Wäre absolut Spitze!


----------



## Sky (30. Mai 2005)

Habe ein wenig in deinem Code rumgetippt und die Änderugen kommentiert... 


```
class wievieleBuchstaben {
    public static void main (String[] args) throws IOException {

       String nameEingabedatei;
       String zeile;
       String aktuellesToken;
       File eingabedatei;
       FileReader fr;
       BufferedReader br;


         nameEingabedatei = "c:/test.txt";      //sky80: Dateiname geändert
         //Anzahl der Worte ermitteln
         System.out.println("Inhalt von "+nameEingabedatei);
         eingabedatei = new File(nameEingabedatei);
         fr = new FileReader(eingabedatei);
         br = new BufferedReader(fr);
         zeile=br.readLine();     //sky80: es wird nur die 1. Zeile eingelesen, dass ist klar, oder??
         analyse (zeile);
    }

    public static void analyse(String s) {
        //sky80: 'text' wird nicht benötigt, String bietet eine Methode zur Umwandlung:
        s = s.toUpperCase();
        int[] anzahl = new int[26];
        int i;
        for (i = 0; i < s.length(); i++)
            anzahl[(s.charAt(i)-65)]++;              // und jetzt zählen ;-)
        for (i = 0; i < 26; i++)
            System.out.println((char) (i+65) + ": " + anzahl[i] + "\t" + stern(anzahl[i]));       // Ergebnis ausgeben
    }

    public static String stern(int anzahl) {
        StringBuffer s = new StringBuffer();
        //for (int i = 0; i<anzahl; i++) s+="*";    // String += String sollte man nicht machen wg. Performanz
        for (int i = 0; i<anzahl; i++) s.append('*');
        return s.toString();
    }
}
```


----------



## mangrove (30. Mai 2005)

VIELEN DANK für deine Bemühungen!

Hat es bei dir funktioniert - bei mir leider nicht es kam:

java.lang.ArrayIndexOutOfBoundsException
	at test.wievieleBuchstaben.analyse(wievieleBuchstaben.java:45)
	at test.wievieleBuchstaben.main(wievieleBuchstaben.java:34)
Exception in thread "main" 

Paul


----------



## mic_checker (30. Mai 2005)

Hast du nur Groß/Klein Buchstaben bei dir in der Datei ?


----------



## mangrove (30. Mai 2005)

Nein!

Gemischt - Klein als auch Großbuchstaben als auch Sonderzeichen!

Ich hoffe das hilft dir weiter!


----------



## mic_checker (30. Mai 2005)

Hol mal ne Datei mit nur Groß/KLeinbuchstaben, sonst nichts....wahrscheinlich macht er hier nen Fehler:


```
anzahl[(s.charAt(i)-65)]++;
```


----------



## Guest (30. Mai 2005)

Ich hab ne Datei erstellt die wie folgt aussieht:



dies ist ein TEST

jawohl ein Test



die Datei heißt test.txt und liegt auf C:

leider funktioniert es nicht!

Mache ich was falsch?


----------



## mic_checker (30. Mai 2005)

Du müsstest noch kontrollieren ob es sich um einen Buchstaben handelt. Dann kannst du entsprechend die Position im Array für diesen Buchstaben ansprechen.

Also Rückgabewert von charAt(i) überprüfen.


----------



## Guest (30. Mai 2005)

Dürfte ich dich wieder um diesen Code bitten - ich weiß nicht wie man überprüft ob es sich um ein Zeichen handelt!

Bitte!


----------



## mic_checker (30. Mai 2005)

probiers mal damit:

```
char ch;
        for (i = 0; i < s.length(); i++) {
        	ch = s.charAt(i);
	        if(ch >= 65 && ch <= 90)
            anzahl[ch-65]++;
         }
```


----------



## mangrove (30. Mai 2005)

DU BIST EIN GENIE!!!!!!!!!!!!!!!!!!!!!!

DANKE!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

-----------------------------------------


----------



## mangrove (30. Mai 2005)

wie könnte ich das noch machen das mehrere Zeilen eingelesen werden? (event. auch Sonderzeichen erkannt werden)

Das wäre meine letzte Frage!


----------



## mic_checker (30. Mai 2005)

mach halt ein while um dein readLine() und guck ob es != null ist.

Wenn du sonderzeichen haben willst musst du mehr Platz im Array reservieren....


----------



## mangrove (30. Mai 2005)

So???

while (readLine() != 0){
     zeile=br.readLine();
}


SUPER - DANKE - Das mit dem mehr Platz machen reicht voll aus!!!


----------



## mic_checker (30. Mai 2005)

In die while Bedingung solltest du noch das zeile = ... reinpacken, damit du in while auf zeile richtig zugreifen kannst.


----------



## mangrove (31. Mai 2005)

Vielen DANK für deine Hilfe!!!

Leider funktioniert das nicht ganz so!


```
while (br.readLine() != ""){
    zeile=br.readLine();
}
analyse (zeile); //hier sagt er mir dann: The local variable zeile may not have been initialized
```

Wenn ich das wegbekommen würde wäre ich endlich fertig!


----------



## mic_checker (31. Mai 2005)

die analyse muss in die schleife rein, außerdem musst du die Schleife dann so aufbauen:


```
while((zeile = br.readLine()) != null) {
analyse(zeile);
}
```

sollte so klappen....


----------



## mangrove (31. Mai 2005)

leider nicht - dann kommt:

java.lang.Error: Unresolved compilation problem: 
	Unmatched bracket

	at java.lang.reflect.Constructor.newInstance(Native Method)
	at test.wievieleBuchstaben.main(wievieleBuchstaben.java:13)
Exception in thread "main"


----------



## mic_checker (31. Mai 2005)

bei mir funzts


----------



## mangrove (31. Mai 2005)

komisch!?

siehts bei dir auch so aus:


```
import java.io.*;

class wievieleBuchstaben {
    public static void main (String[] args) throws IOException {

       String nameEingabedatei;
       String zeile;
       String aktuellesToken;
       File eingabedatei;
       FileReader fr;
       BufferedReader br;


         nameEingabedatei = "HHGTTG.txt";
         System.out.println("Inhalt von "+nameEingabedatei);
         eingabedatei = new File(nameEingabedatei);
         fr = new FileReader(eingabedatei);
         br = new BufferedReader(fr);
         while((zeile = br.readLine()) != null) {
			analyse(zeile);
		 } 

    public static void analyse(String s) {
    	
        s = s.toUpperCase();
        int[] anzahl = new int[32];
        int i;
        char ch;
        for (i = 0; i < s.length(); i++) {
           ch = s.charAt(i);
           if(ch >= 65 && ch <= 90)
            anzahl[ch-65]++;
         } 
        for (i = 0; i < 32; i++)
            System.out.println((char) (i+65) + ": " + anzahl[i] + "\t" + stern(anzahl[i]));      
    }

    public static String stern(int anzahl) {
        StringBuffer s = new StringBuffer();
        
        return s.toString();
    }
 
} 
}
```


----------



## mangrove (31. Mai 2005)

bei mir gehts jetzt auch!!! *hurra*

Aber jede Zeile einzeln ;-)


----------



## mic_checker (31. Mai 2005)

Kontrollier mal deine Klammersetzung, am Ende eine zu viel, nach while fehlt noch eine....sollte dann so aussehen:


```
import java.io.*;

class wievieleBuchstaben {
    public static void main (String[] args) throws IOException {

       String nameEingabedatei;
       String zeile;
       String aktuellesToken;
       File eingabedatei;
       FileReader fr;
       BufferedReader br;


         nameEingabedatei = "C://test.txt";
         System.out.println("Inhalt von "+nameEingabedatei);
         eingabedatei = new File(nameEingabedatei);
         fr = new FileReader(eingabedatei);
         br = new BufferedReader(fr);
         while((zeile = br.readLine()) != null) {
         analyse(zeile);
       }
      }

    public static void analyse(String s) {
       
        s = s.toUpperCase();
        int[] anzahl = new int[32];
        int i;
        char ch;
        for (i = 0; i < s.length(); i++) {
           ch = s.charAt(i);
           if(ch >= 65 && ch <= 90)
            anzahl[ch-65]++;
         }
        for (i = 0; i < 32; i++)
            System.out.println((char) (i+65) + ": " + anzahl[i] + "\t" + stern(anzahl[i]));     
    }

    public static String stern(int anzahl) {
        StringBuffer s = new StringBuffer();
       
        return s.toString();
    }


}
```

edit:
ok


----------



## mangrove (31. Mai 2005)

Stimmt - hatte ich nen Fehler! DANKE

Aber kommt bei dir das Ergebnis nicht auch einzeln pro Zeile???

Also:

A: 2
B: 0
....
A: 4
B: 2
....
A: 5
...


----------



## Sky (31. Mai 2005)

Willst Du die Analyse für die ganze Datei durchführen? Das geht dann ungefähr so (Code nicht getestet)


```
StringBuffer fileContent = new StringBuffer(); // StringBuffer anlegen, der den Inhalt der Datei aufnimmt
while((zeile = br.readLine()) != null) { 
  fileContent.append( zeile ); // eingelesene Zeile an den Buffer ranhängen
} 
analyse(fileContent.toString()); // Datei Analyse durchführen
```


----------



## mic_checker (31. Mai 2005)

Oder aber du rufst nicht jedes Mal in analyse stern(..) etc. auf, sondern erst nach den ganzen Aufrufen von analyse....


----------



## Sky (31. Mai 2005)

mic_checker hat gesagt.:
			
		

> Oder aber du rufst nicht jedes Mal in analyse stern(..) etc. auf, sondern erst nach den ganzen Aufrufen von analyse....


Dann müßte der Code aber noch'n bißchen umgebaut werden:
- das int[] darf nicht bei jeder Zeile angelegt werden, sondern muss Instanzweise zur Verfügung stehen
- die Ausgabe muss in eine neue Methode (z.B. ausgabe() ) verlegt werden


----------



## mic_checker (31. Mai 2005)

ja, da hast du natürlich recht ,hätte ich wohl noch dabei schreiben sollen....


----------

