# Lesen einer Datei - Wort zählen



## Löffler (2. Dez 2009)

Hallo

wir sollen ein Programm schreiben welches eine Online .txt Datei liest und ausgibt in wievielen Zeilen das Wort "foren" vorkommt. Ich habe es jetzt geschafft es erstmal hin zu bekommen das er die txt Datei einliest und komplett wieder ausgibt über die Konsole. Nun weiss ich aber nicht weiter wie ich das hinbekomme das er die Zeilen in dem das Wort "foren" vorkommt zählt und nur die Anzahl per Kosole ausgibt. 


```
import java.util.Scanner;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.URL;

public class foren {
    public static void main(String[] args) {
        try {
            String urlName = "[ Adresse entfernt ]";
            URL url = new URL(urlName);
            InputStream inputStream = url.openStream();
            InputStreamReader inputStreamReader = new InputStreamReader(inputStream);
            BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
            String zeile = bufferedReader.readLine();
            while (zeile != null) {
                System.out.println(zeile);
                zeile = bufferedReader.readLine();
            }
            bufferedReader.close();
        } catch (IOException e) {
            System.err.println("Lesefehler.");
        }
    }
}
```


----------



## SlaterB (2. Dez 2009)

Tipp: wenn du das nun noch 100x testest, dann besser in einem Test-String "foren x foren y foren z";
direkt im Programm, statt für jeden Test das halbe Internet zu bemühen 

-------

indexOf im String kann da helfen, gibt verschiedene dieser Methoden, mit unterschiedlichen Parametern..
String (Java Platform SE 6)


----------



## Löffler (2. Dez 2009)

da gibt es schon nen paar Möglichkeiten, habe mir jetzt bisschen was dazu durchgelesen in der API
aber wirklich weiter hat mich das nicht gebracht. Laut API gibt indexOF die erste Position des im String enthaltenen wort aus. Das is auch nicht gerade das was ich suche bzw is mir auch nicht klar wie ich diese Methode überhaupt implementiere.
Ich hab schon lange gebraucht um das überhaupt so hinzu bekommen das er die Datei erstmal vernünftig einliest


----------



## SlaterB (2. Dez 2009)

indexOf musst du nicht implementieren, nur aufrufen,
und wie gesagt gibt es mehrere derartiger Methoden, die nicht nur nach dem ersten suchen,

ne Schleife und bisschen Logik gehört natürlich dazu, vollständig erklären kann man es kaum, 
wenn man nicht gerade für dich die Aufgabe lösen soll


----------



## Löffler (2. Dez 2009)

will auch net die Lösung, die bringt mir net viel ^^

bzw  habe ich mich weiter in das indexof eingearbeitet und mir kam auch schon die Idee ne Schleife zu machen im zusammenhang mit dem indexof...
werd mich noch mal damit beschäftigen und denke mit dem indexof sollte ich das hinbekommen.
Danke für eure Hilfe.


----------



## w0ddes (3. Dez 2009)

es gibt da ne Methode, nennt sich 
	
	
	
	





```
contains(Object o)
```
.  Diese durchsucht, ob in einer Collection, auf der diese Methode angewendet wird, das Objekt "o" (das ja auch ein bestimmter String sein kann) enthalten ist und gibt dann true oder false zurück.

siehe: Collection (Java 2 Platform SE 5.0).

Ich selbst würde das z.B. so benutzen: 
	
	
	
	





```
int counter = 0;
if (string.toLowerCase().contains("forum"))
{
   counter++;
}
```


----------



## dngfng (3. Dez 2009)

```
public int numberOfOccurences(String zeile, String wort) {
	        int count = 0;
	        int pos = zeile.indexOf(wort);
	        while (pos != -1) {
	            count++;
	            pos = zeile.indexOf(wort,++pos);
	 
	            if (pos == -1)
	                break;
	        }
	        return count;
	    }
```

indexOf(wort) gibt die Erste Index Position zurück an der das Wort gefunden wurde. Falls es nicht gefunden ist der wert -1. Um nach einen weiteren vorkommen zu finden wird einfach die pos verwendet und um eins hoch gesetzt um zu überprüfen ob das Wort nochmals in der Zeile vorkommt.


----------



## Löffler (3. Dez 2009)

erstmal danke für eure Vorschläge, doch ich bekomme bei beiden diese Fehlermeldung:
java.lang.NullPointerException
	at foren.main(Lorem.java:27)

Warum muss denn hier die NullPointerexception rein bzw warum wird sie ausgelöst?  foren ist definitiv in dem robot text enthalten

```
import java.util.Scanner;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.URL;

public class foren {
    public static void main(String[] args) {
        try {
            String urlName = "http://www.abakus-internet-marketing.de/robots.txt";
            URL url = new URL(urlName);
            InputStream inputStream = url.openStream();
            InputStreamReader inputStreamReader = new InputStreamReader(inputStream);
            BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
            String zeile = bufferedReader.readLine();

            while (zeile != null) {
               zeile = bufferedReader.readLine();
            }
                  int counter = 0;
                  if (zeile.toLowerCase().contains("foren"))
                  {
                      counter++;
                    }  
          bufferedReader.close();
            
        } catch (IOException e) {
            System.err.println("Lesefehler.");
        }
 
    }
}
```


----------



## SlaterB (3. Dez 2009)

Zeile 18 bis 20 überschreibt solange die Variable zeile, bis sie endlich null ist (Schleifenbedingung),
dann, wenn sie null ist, greifst du mit contains darauf zu..


----------



## w0ddes (3. Dez 2009)

du musst den Aufruf  int counter = 0; vor der while schleife ausführen, und die if-anweisung in die while-schleife packen


----------



## Dozor (8. Dez 2009)

Hi,

zeile 21 auf 17,             // ansonsten stellst du es immer auf 0 bzw wenn du es auf 0 setzt ist das File schon zu ende
zeile 19 und 20 nach 25         // ansonsten überliest du gleich die erste Zeile und fängst gleich mit der zweiten an
verschieben
[JAVA=17]
int counter = 0;
	while (zeile != null) {
		if (zeile.toLowerCase().contains("foren")) {
			counter++;
		}
		zeile = bufferedReader.readLine();
	}
[/code]

Gruß
Dozor


----------

