# text durchsuchen -> satzzeichen entfernen



## hdi (21. Sep 2008)

hallo,

das ist etwas schwer zu erklären, ich will euch jetzt auch nicht mit meinem trash code langweilen.

mein problem: ich zähle wörter in einem text, und kriege es irgendwie nicht hin, satzzeichen wegzuschneiden.

ich habe es schon versucht, mittels (ein beispiel für ein wort dass einen satz beendet, also mit "." aufhört) :


```
if(word.contains("."){
   word = word.substring(0,word.length()-1);
}
```

wenn ich mir jetzt das ergebnis nach diesem schritt ausgeben lasse, wurde tatsächlich aus zB "hallo." ein "hallo"
gemacht.

*ABER:*

wenn ich nun ein "hallo" in dem text mittels equals() vergleiche mit einem ursprünglichen "hallo." aus dem mit 
der oben genannten bearbeitung ein "hallo" gemacht habe, kommt *FALSE* heraus..

also irgendwas passt da nicht. wieso?

danke


----------



## SlaterB (21. Sep 2008)

> wieso? 

weil du keinen Code postest..

selbstverständlich funktioniert es, anderenfalls ist noch ein Leerzeichen drin oder ein beliebiger anderer Fehler

wann immer du glaubst, zwei gleiche Strings zu haben, deren equals false ergibt,
ist das kinderleicht nachzuprüfen:
Länge der beiden Strings vergleichen/ ausgeben sowie jeden char als ASCII-Code in einer Schleife prüfen

-------

> if(word.contains("."){ 

gefährliche Sache, der Punkt muss ja nicht am Ende des Strings sein..
(gibt auch string.endsWith())


----------



## hdi (21. Sep 2008)

danke erstmal für den tipp mit endsWith(), habe das nun ersetzt!

Ich möchte halt nicht nur euch zumüllen mit meinem Code, sondern versuche erst selber herauszufinden
woran es liegt um euch dann nur diesen Teil zu präsentieren.

Aber scheinbar irre ich mich, dann poste ich jetzt doch meinen Code. Wie ich sagte, ist es etwas chaotisch.
Also es sieht so aus:


```
fr = new BufferedReader(new FileReader("C:/analyze.txt"));
            while ((line = fr.readLine()) != null) {

                laca = line.toCharArray();
                int j=0;
                for (int i = 0; i < laca.length; i++) {
                    if (laca[i] == ' ' || laca[i] == '!' || laca[i] == '?' || laca[i] == '.' ||
                            laca[i] == ',' || laca[i] == '-' || laca[i] == '\"' || laca[i] == '\'') {  
   
                        // Es wurde ein Satzzeichen im String gefunden, d.h. alles von Anfang bis zu dieser Stelle
                        // ist ein Wort. Nun wird noch das Satzzeichen entfernt und das Wort gespeichert:

                        word = line.substring(i-j, i+1); 

                        // wort bearbeiten (punkte, komma etc wegschneiden)
                        if(word.endsWith(".") || word.endsWith("!") ||  word.endsWith("?") ||
                          word.endsWith(",")  ||  word.endsWith("-")  ||  word.endsWith("\"") ||  word.endsWith("\'")){
                            
                            word = word.substring(0,word.length()-1);
                        }

                       // hier wird jetzt etwas mit dem wort gemacht, ich füge es zB in eine liste ein und fertig

                        // nachdem dieses Wort gefunden wurde, wird j wieder 0 gesetzt um für den weiteren Verlauf
                        // des Line-Strings wieder zu wissen, wo das neue Wort begonnen hat:
                        j = 0;
                        }
                    }
                    else{
                       // wird hochgezählt, solange ein Wort nicht abgeschlossen ist, um zu wissen wo das Wort
                       // begonnen hat bzw. wie lang es ist (um den richtigen substring zu finden!)
                        j++;
                    }
                }
                
            }
```

So, also habe alles kommentiert, ich hoffe man versteht es. 
Ich speichere ja alle Wörter in eine Liste, die ich mir am Ende ausdrucke. Dort stehen dann alle Wörter
und daneben die Anzahl ihrer Vorkommen (diesen Teil hab ich jetzt hier weggelassen).

*EDIT*
Ich habe jetzt rumprobiert, und festgestellt, dass bei dem einen hallo wo ein punkt dran war, kein leerzeichen
mehr zum string gehört, was bei allen anderen string der fall ist! Deshalb hänge ich in dem fall einfach
ein " " an und damit ist das also *GELÖST!*

*Aber es gibt weiterhin ein Problem:*

Das letzte Wort wird nie bearbeitet, ich denke es liegt daran dass mir oben in der Abfrage:


```
if (laca[i] == ' ' || laca[i] == '!' || laca[i] == '?' || laca[i] == '.' ||
                            laca[i] == ',' || laca[i] == '-' || laca[i] == '\"' || laca[i] == '\'') {
```

noch das END OF FILE fehlt, also er erkennt beim letzten wort keinerlei abschlusszeichen und speicher somit 
kein wort. Aber wie kann ich das überrpüfen, gibts da auch ein Terminalsymbol dafür als Char?


----------



## Schandro (21. Sep 2008)

String newString = oldString.replace(".","");
ersetzt alle Punkte durch einen leeren String...
ist denke ich mal eine viel bessere lösung als die, die du gemacht hast. Bei dir werden sie schleißlich nur enfernt, wenn sie am schluss stehen


----------



## hdi (21. Sep 2008)

Also das mit den Punkten funktioniert schon soweit, auch "..." etc werden rausgefilert.

Ich hab jetzt nur noch 2 Probleme:

*1)* Was ist das Char-Escape Zeichen für End Of File, bzw. wie kann ich es anders lösen dass auch das letzte Wort noch mitgenommen wird?

*2)* Ich habe eigentlich Zeichen wie " und ' herausgenommen, allerdings ist es so dass im Text 
andere Versionen davon vorkommen können. 
zB:

WORLD’S

Dieses Apostroph da kann man in im Editor nicht schreiben, man kann ´ schreiben, aber das sieht ja
anders aus und es funktioniert auch nicht. Dann zB noch so kursive Dinge wie ”, das geht auch nicht nur "

In der ASCII Tabelle finde ich diese Zeichen irgendwie auch nicht.. Also wie kann ich die rausfiltern??

danke


----------



## SlaterB (21. Sep 2008)

letztes Wort innerhalb einer Zeile:
prüfe i == laca.length-1

letze Zeile:
lies alle Zeilen vorher in eine Liste ein oder zumindest immer eine Zeile im Vorraus, damit du weißt, wann die letzte erreicht ist


----------

