Problem beim Auslesen aus File

Dulin

Mitglied
Liebe Community,

ich bin noch ziemlicher Neuling in Java und hoffe hier, Hilfe zu finden.

Und zwar habe ich eine Textdatei, die ausgelesen werden soll. Der Inhalt wird erst mal auf der Konsole ausgegeben.
In dieser Textdatei befinden sich mehrere Wörter, die mit Leerzeichen, aber auch mit anderen Zeichen voneinander getrennt sind. Diese Zeichen gilt es, in Leerzeichen umzuwandeln.
So weit so gut, das klappt wunderbar.
Jetzt soll der Ausgabestrom nach Wörtern getrennt werden, sprich jedes Wort mit Zeilenumbruch als Trennung in ein Array cbuf[] geschrieben werden.
Hier liegt mein Problem: Die Wörter werden zwar getrennt, allerdings habe ich nach jedem Buchstaben sehr viele Leerzeichen - um genau zu sein, so viele wie das cbuf[]-Array Indexe hat. Ich habe keine Ahnung, woran das liegen könnte und ersuche euch daher um Rat.

Argumente der Main-Methode sind: Name der Ein- und Ausgabedatei.

Klasse Control mit Main-Methode
Java:
/**
 * Steuert den Programmablauf
 */

import java.io.*;
import java.util.*;

public class Control{
    private static String inputFileName = null;    // Name der Input-Datei
    private static String outputFileName = null;   // Name der Output-Datei

    /**
     * Nimmt die einzulesende Textdatei auf und verwaltet den Vorgang des
     * Programmes.
     * Erstellt anschließend die Ausgabedatei.
     */
    public static void runtime(){
        try{
            // Aufbau der Reader-Kette
            FileReader FR = new FileReader(inputFileName);          // Datei auslesen
            SpaceFilterReader SFR = new SpaceFilterReader(FR);      // Sonderzeichen filtern
            WordFilterReader WFR = new WordFilterReader(SFR);       // Wörter bilden
            
            TreeMap<Integer, String> WordMap = new TreeMap<Integer, String>();

            // Buffergröße bestimmen
            char cbuf[] = new char[500];                // Buffer-Variable
            char character;                             // Alle Zeichen, in Wörter aufgeteilt

            // Solange lesen, bis das Ende der Datei erreicht wird
            while(WFR.ready()){
                String word = null;
                character = (char)WFR.read(cbuf, 0, cbuf.length);
                word = new String(cbuf);
                
                System.out.println(word);
                if(character == '\n'){
                    WordMap.put(1, word);
                }

            }
        }
        catch(IOException e){
            System.out.println(e+" - Die Datei konnte nicht geöffnet werden.");
        }
    }
    
    /**
     * Steuert den gesamten Ablauf des Programms
     * @param args the command line arguments
     */
    public static void main(String[] args) throws IOException{

        try{
            if(args.length == 0)        // Prüfen, ob -i=<infilename> keinen Wert enthält.
                throw new IOException("Es muss mindestens der Name der Input-Datei eingegeben werden!");
            else{                       // Dateinamen zuweisen
                inputFileName = args[0].substring(3);
                runtime();
            }
                
        }
        catch(IOException ex){
            System.out.println("Bla: "+ex);
        }
    }
}

Klasse SpaceFilterReader - Wandelt Zeichen (außer: 0-9, a-z, A-Z, Umlaute) in Leerzeichen um
Java:
import java.io.*;
/**
 * Wandelt alles außer Buchstaben, Umlaute und Zeichen in Leerzeichen um.
 */
public class SpaceFilterReader extends FilterReader{

    public SpaceFilterReader(Reader in){
        super(in);
    }

    /**
     * Filtert die Zeichen zu Leerzeichen
     * @return zeichen, das konvertierte Zeichen
     */
    @Override
    public int read() throws IOException{
        int character = 0;                // Das Zeichen, welches gelesen wird
        try{
            character = this.in.read();   // Besorgt ein Zeichen
      
            if(character == -1)           // Prüfen, ob die Datei zu ende ist.
                return character;
            
            // Sonderzeichen abfragen und umwandeln
            if    ((char)character >= '!' && (char)character < '0') character = ' ';
            else if((char)character > '9' && (char)character < 'A') character = ' ';
            else if((char)character > 'Z' && (char)character < 'a') character = ' ';

            // Umlaute abfragen und Zeichen zurückliefern.
            else if((char)character == 'ü' || (char)character == 'Ü' ||
                    (char)character == 'ä' || (char)character == 'Ä' ||
                    (char)character == 'ö' || (char)character == 'Ö') return character;
            else if(character == 225) return character;

            // Nachdem die Umlaute geprüft sind, werden alle weiteren Zeichen hinter z geprüft.
            else if((char)character > 'z') character = ' ';
        }
        catch(IOException e){
            System.out.println("Ein Fehler ist aufgetreten: "+e);
        }
        return character;
    }
}

Klasse WordFilterReader - Trennt den Strom nach Worten
Java:
import java.io.*;
/**
 * Trennt den Eingabestrom nach Worten.
 * Trennung erfolgt bei jedem Zeichen kleiner oder gleich dem Leerzeichen.
 */
public class WordFilterReader extends FilterReader {

    WordFilterReader(Reader in){
        super(in);
    }

    /**
     * Liest Zeichen aus einem Dokument und speichert diese wortweise im cbuf[]. Ersetzt hierbei
     * alle Zeichen kleiner oder gleich dem Leerzeichen mit einem Zeilenumbruch.
     * @param cbuf, ein zusammengesetztes Wort
     * @param off, Ab wo gelesen werden soll
     * @param len, Max. Anzahl an Zeichen, die ausgelesen werden sollen
     * @return amountOfChars, die Anzahl der gelesenen Zeichen
     */
    @Override
    public int read(char cbuf[], int off, int len) throws IOException{
        int character = 0;                   // Aktuell gelesenes Zeichen

        try{
            // Zeichen von der Position off aus bis len durchlaufen
            for(int amount = off; amount < len;){
                character = this.in.read();

                // Prüfen, ob Ende der Datei erreicht ist.
                if(character == -1)
                    return character;

                // Zeichen <= Leer durch Zeilenumbruch ersetzen und zurückliefern
                else if(character <= ' '){
                    character = '\n';
                    cbuf[amount] = (char)character;     // Einfügen in's Array
                    amount++;                           // Schleifenzähler heraufsetzen
                }
                
                // Wenn das Zeichen kein Leerzecihen ist:
                else if(character > ' '){
                    cbuf[amount] = (char)character;      // Einfügen in's Array
                    amount++;                            // Schleifenzähler heraufsetzen
                }

                return character;
            }
        }
        catch(IOException e){
            System.out.println("Fehler: "+e);
        }
        return character;
    }
}
 

Dulin

Mitglied
Ich habe den Fehler gefunden: Klasse WordFilterReader, Zeile 46.
Aufgrund des Returns wird die Methode beendet, wordurch die Wörter nicht vollständig gebildet werden können.

Ich lasse den Thread aber mal auf, falls noch weitere Fragen auftauchen. Danke schonmal an diejenigen, die bisher drübergeschaut haben.
 

Michael...

Top Contributor
Hab den Code nur mal schnell überflogen:
- Musst Du das so machen?
- Von SpaceFilterReader wird zwar ein Objekt erzeugt, aber nie genutzt (sofern ich da nicht was übersehen habe)
- In WordFilterReader überschreibst Du die Methode
Code:
public int read(char[], int, int)
die in der ursprünglichen Form und laut Deiner Doku-Kommentare eigentlich die Anzahl der eingelesenen Zeichen zurückliefern soll. Deine Variante liefert aber im Erfolgsfall das erste eingelesene Zeichen zurück. Ohnehin wird nur das erste Feld von
Code:
cbuf
befüllt, da aufgrund von Zeile 46
Code:
return character;
die for-Schleife und die Methode auf jeden Fall im ersten Durchlauf beendet wird.
- und alles mit dem Key 1 in die TreeMap stecken zu wollen
Code:
WordMap.put(1, word);
ist vermutlich auch nicht Absicht!?

So ganz hab ich das noch nicht geblickt wie das laufen soll.

Wenn ich sowas machen müsste, würde ich das txt-File einfach per BufferedReader zeilenweise einlesen, dann mittels Sting#split() und einem entsprechenden regulären Ausdruck jede Zeile in ihre Worte zerlegen, die ich dann in eine Liste stecke bzw. in die Ausgabedatei schreibe.
Wären geschätzt so um die zehn Zeilen Code.
 

Dulin

Mitglied
Hi Michael,

danke für deine Antwort.
- Jap, das muss leider so.
- SpaceFilterReader wird genutzt, da der Zeiger in WordFilterReader darauf zeigt.
- Ja, die Rückgabe ist eigentlich sinnlos. Durch die Methode wird das cbuf[]-Array beeinflusst. Da es aus Control übergeben wird, muss es nicht von der Methode zurückgeliefert werden.

Die Ausgabe funktioniert aber soweit. Jetzt muss ich die Wörter noch zählen und entsprechend ihrer Häufigkeit sortieren.
Dafür habe ich eine neue Klasse "WordSorter" erstellt, die eine verkettete Liste mit je einem Wort pro Index bekommt und anschließend zählen und sortieren soll.

Mein Problem ist jetzt, dass ich die Wörter nach ihrer Zählung mit ihrer Häufigkeit in einer TreeMap<String, Integer> speichere (weil diese gleiche Indexe aussortiert => Dopplungen werden eliminiert) und nicht weiß, wie ich diese nach Anzahl sortieren kann...
Es gibt ja noch die Collections.sort()-Methode, allerdings benötige ich dafür ja eine Liste, die mir aber keine doppelten Indexes erlaubt... Die sortierte Liste sollte dann auch zurückgegeben werden (nicht die Map, wie es jetzt im Quellcode der Fall ist).

Die Ausgabe sollte nachher wie folgt aussehen:
4 Katze
3 Auto
3 Wurst
1 Lecker
1 blubb
1 ... etc

Hier nochmal der aktuelle Stand des Quellcodes:
Java:
/**
 * Steuert den Programmablauf
 */

import java.io.*;
import java.util.*;

public class Control{
    private static String inputFileName = null;    // Name der Input-Datei
    private static String outputFileName = null;   // Name der Output-Datei

    /**
     * Nimmt die einzulesende Textdatei auf und verwaltet den Vorgang des
     * Programmes.
     * Erstellt anschließend die Ausgabedatei.
     */
    public static void runtime(){
        try{
            // Aufbau der Reader-Kette
            FileReader FR = new FileReader(inputFileName);          // Datei auslesen
            SpaceFilterReader SFR = new SpaceFilterReader(FR);      // Sonderzeichen filtern
            WordFilterReader WFR = new WordFilterReader(SFR);       // Wörter bilden
            
            // Collection zum Unterbringen und Zählen der Wörter
            LinkedList<String> WordList = new LinkedList<String>();
            WordSorter WS;

            // Sonst. Variablen
            char character;                // Alle Zeichen, in Wörter aufgeteilt
            int wordCount = 0;             // Anzahl der Wörter
            String word = null;            // Aktuell ausgelesenes Wort

            /*
             * Da cbuf[] ein Referenzdatentyp ist, ist die Rückgabe des Arrays in der Methode WFR.read() nicht von Nöten,
             * da beide - Methode und SOS-Klasse - auf das Array referenzieren!
             */

            // Wörter auslesen und in Liste schreiben:
            while(WFR.ready()){                                         // Solange Lesen, bis Ende der Datei erreicht wird

                char cbuf[] = new char[200];                            // Buffer-Variable
                character = (char)WFR.read(cbuf, 0, cbuf.length);       // Wort auslesen
                word = new String(cbuf).trim();                         // Char-Array zum String umwandeln


                WordList.add(wordCount, word);                          // Wort in die TreeMap schreiben
                System.out.println("Index "+wordCount+": " + WordList.get(wordCount));
                wordCount++;
            }

            // Wörter nach Häufigkeit sortieren
            WS = new WordSorter(WordList);
            TreeMap <Integer, String> WordMap;
            WordMap = WS.sort();
        }
        catch(IOException e){
            System.out.println(e+" - Die Datei konnte nicht geöffnet werden.");
        }
    }
    
    /**
     * Steuert den gesamten Ablauf des Programms
     * @param args the command line arguments
     */
    public static void main(String[] args) throws IOException{

        try{
            if(args.length == 0)        // Prüfen, ob -i=<infilename> keinen Wert enthält.
                throw new IOException("Es muss mindestens der Name der Input-Datei eingegeben werden!");
            else{                       // Dateinamen zuweisen
                inputFileName = args[0].substring(3);
                runtime();
            }
                
        }
        catch(IOException ex){
            System.out.println("Bla: "+ex);
        }
    }

Java:
import java.util.*;
/**
 * Zählt die Wörter nach Häufigkeit auf und speichert sie in eine sortierende Collection.
 */
public class WordSorter {

    private LinkedList WordList;
    
    public WordSorter(LinkedList LiLi){
        WordList = LiLi;
    }

    /**
     * Sortiert eine Reihe von Wörtern nach Häufigkeit.
     * @param Liste von Wörtern
     * @return Nach Häufigkeit sortierte Map
     */
    public TreeMap sort(){
        String currentWord = null;  // Wort im Listenelement
        int wordCount = 0;          // Häufigkeit des Wortes
        
        TreeMap<String, Integer> WordMap = new TreeMap<String, Integer>();
        Iterator WordListIterator1 = WordList.iterator();                       // Iterator der äußeren Schleife

        // Gleichartige Wörter zählen
        while(WordListIterator1.hasNext()){                                     // Liste durchlaufen
            wordCount = 0;                                                      // Wortzähler auf Standardwert setzen.
            currentWord = WordListIterator1.next().toString();                  // Wort aus der Liste auslesen
            for(int listElement = 0;listElement < WordList.size(); listElement++){// Liste erneut durchlaufen und vergleichen
                if(currentWord.equals(WordList.get(listElement))){
                    wordCount++;                                                // Wenn Wort übereinstimmt: Häufigkeit++
                }
            }
            WordMap.put(currentWord, wordCount);                                // Wort, Häufigkeit in TreeMap speichern
        }

        System.out.println(WordMap.entrySet());
        System.out.println("Größe: "+WordMap.size());

        System.out.println(WordList.subList(0, WordList.size()));
        return WordMap;
    }
}
 
Zuletzt bearbeitet:
Ähnliche Java Themen
  Titel Forum Antworten Datum
J Problem beim auslesen von Int Wert aus YML-Datei Java Basics - Anfänger-Themen 6
D Problem beim auslesen von TextArea Java Basics - Anfänger-Themen 3
D Problem beim auslesen von txt datei. Java Basics - Anfänger-Themen 26
K Problem beim Auslesen einer Datei Java Basics - Anfänger-Themen 6
C GLOOP Problem beim Erstellen der Kamera Java Basics - Anfänger-Themen 9
sserio Problem beim Anzeigen Java Basics - Anfänger-Themen 5
I Output BigDecimal anstatt double / Problem beim Rechnen Java Basics - Anfänger-Themen 16
P Problem beim Überschreiben einer vererbten Methode Java Basics - Anfänger-Themen 4
J Problem beim vergleich von zwei Integer Java Basics - Anfänger-Themen 3
G Problem beim Speichern von Objekten in einer Datei Java Basics - Anfänger-Themen 7
S Collections funktionale Listen (ListNode<E>) review und problem beim clone Java Basics - Anfänger-Themen 0
C Methoden Problem beim Speichern von Variablen Java Basics - Anfänger-Themen 1
F Problem beim entfernen von mehreren Listenelementen auf einmal (Programmierung des Spiels Arschloch) Java Basics - Anfänger-Themen 1
B Problem beim grundsätzlichen Verständnis bei Rekursion mit 2-dimensionalen Array Java Basics - Anfänger-Themen 6
E Datentypen Problem beim Speichern von enum. Java Basics - Anfänger-Themen 10
A Problem beim Deklarieren von einem BOOLEAN Java Basics - Anfänger-Themen 4
B Gleicher Prozess starten und stoppen (Problem beim Stoppen) Java Basics - Anfänger-Themen 5
DestinatioN Problem beim splitten eines Satzes in Wörter und die Wörter in Buchstaben Java Basics - Anfänger-Themen 2
B Problem beim Angeben einer Eingabe Java Basics - Anfänger-Themen 12
J Encoding Problem beim Einlesen einer txt Datei mit Umlauten Java Basics - Anfänger-Themen 3
R Problem beim Wochenplan (Datum,Wochentag) Java Basics - Anfänger-Themen 30
D Problem beim umwandeln eines Strings in eine Dzezimalzahl Java Basics - Anfänger-Themen 6
A Compiler-Fehler Problem beim einbinden der applet Klasse Java Basics - Anfänger-Themen 2
L Compiler-Fehler Problem beim Programmieren eines Kalenders (java.lang.ArrayIndexOutOfBoundsException) Java Basics - Anfänger-Themen 2
C Problem beim laden eines BufferedImage Java Basics - Anfänger-Themen 2
D Problem beim Lesen einer txt-Datei Java Basics - Anfänger-Themen 8
fLooojava Bluetooth Projekt - Problem beim mehrmaligen Senden Java Basics - Anfänger-Themen 5
E Problem beim Übergeben von Parameter an Methode Java Basics - Anfänger-Themen 2
Z Problem beim Lesen und Schreiben einer Datei Java Basics - Anfänger-Themen 10
R Problem beim erstellen eines neuen Klassenobjekts Java Basics - Anfänger-Themen 2
F Input/Output Problem beim einlesen eines Strings Java Basics - Anfänger-Themen 3
P Problem beim Abschluss im Kompositum Java Basics - Anfänger-Themen 3
M Problem mit null pinterexception beim laden von Bildern Java Basics - Anfänger-Themen 20
K Problem beim Array aufruf Java Basics - Anfänger-Themen 4
J Problem beim ausführen in cmd.exe Java Basics - Anfänger-Themen 4
J Variablen Problem beim einlesen einer Zahl Java Basics - Anfänger-Themen 7
A Problem beim Compilieren Java Basics - Anfänger-Themen 11
J Problem beim Fenster Java Basics - Anfänger-Themen 4
tux20 Problem beim Schreiben von List to File Java Basics - Anfänger-Themen 2
M Problem beim Compilieren Java Basics - Anfänger-Themen 14
Maxim6394 Problem beim Abspielen von Sounds Java Basics - Anfänger-Themen 8
S Problem beim ersten compilieren überhaubt Java Basics - Anfänger-Themen 43
H Problem beim lesen des InputStreams von einem Subprozess Java Basics - Anfänger-Themen 4
Luk10 Problem beim .jar Datei erstellen Java Basics - Anfänger-Themen 19
L Problem beim Ausführen Java Basics - Anfänger-Themen 40
A Problem beim einfügen in eine Datenbank Java Basics - Anfänger-Themen 2
E Problem beim Programmieren eines Kartenspiels Java Basics - Anfänger-Themen 3
A Problem beim Ausführen einer .jar datei auf externen System Java Basics - Anfänger-Themen 5
M Problem beim compilieren Java Basics - Anfänger-Themen 6
JAVAnnik problem beim lvl laden Java Basics - Anfänger-Themen 15
L Problem beim Einlesen einer Datei in einen String Java Basics - Anfänger-Themen 12
W Problem beim erstellen eines Tests Java Basics - Anfänger-Themen 16
JAVAnnik Problem beim Objekt bewegen Java Basics - Anfänger-Themen 20
A Erstes Programm - Problem beim Ausführen als jar Java Basics - Anfänger-Themen 3
S Problem beim Speichern und Laden von Daten Java Basics - Anfänger-Themen 13
B Problem beim Abspielen einer Videodatei Java Basics - Anfänger-Themen 4
S Problem beim Erstellen eines Scanner-Objekts Java Basics - Anfänger-Themen 7
W Problem beim CSV-Import Java Basics - Anfänger-Themen 5
M Datentypen Problem beim zusammenstellen eines Abfrage-Strings Java Basics - Anfänger-Themen 3
K Collections Problem beim import von Packages Java Basics - Anfänger-Themen 10
S Problem beim Kompilieren - cannot find symbol - constructor() Java Basics - Anfänger-Themen 12
B Problem beim Email versenden mit Javamail Java Basics - Anfänger-Themen 5
H Problem beim Anfang von Java (Java Editor) Java Basics - Anfänger-Themen 2
I Problem beim Schreiben eines ersten Programms Java Basics - Anfänger-Themen 3
D Problem beim Zeichnen von "Das Haus vom Nikolaus" Java Basics - Anfänger-Themen 10
A Problem beim Splitten eines Strings Java Basics - Anfänger-Themen 10
S Problem mit ObjectInputStream beim Einlesen von LinkedList Java Basics - Anfänger-Themen 3
J Problem beim Löschen von elementen aus einer ArrayList Java Basics - Anfänger-Themen 5
V Problem beim Programm laden Java Basics - Anfänger-Themen 5
H Problem beim kompilieren Java Basics - Anfänger-Themen 3
C ActionListener problem beim starten von programmen Java Basics - Anfänger-Themen 3
4 OOP Problem beim Speichern verschiedener Klassen in verschiedenen Dateien Java Basics - Anfänger-Themen 25
T Problem beim Returnwert einer Methode Java Basics - Anfänger-Themen 12
M line.separator: Problem beim Lesen einer Datei Java Basics - Anfänger-Themen 11
Miladriel Problem beim Neuzeichnen nach deiconify Java Basics - Anfänger-Themen 9
R Problem beim Ausführen von Java-PGM aus der shel Java Basics - Anfänger-Themen 3
G Problem beim Sortieren einer Liste Java Basics - Anfänger-Themen 20
M Problem beim Ereignishandling mit Menü Java Basics - Anfänger-Themen 2
H problem beim zeichen im JFrame Java Basics - Anfänger-Themen 6
F Problem beim Objekteaufruf... Java Basics - Anfänger-Themen 4
E BlockChallenge: Problem beim löschen der Blöcke Java Basics - Anfänger-Themen 3
H Problem beim Verkürzen von Programm Java Basics - Anfänger-Themen 3
T Problem beim Werfen und Fangen von Exceptions Java Basics - Anfänger-Themen 2
M Problem beim Zugriff auf Daten GUI + Startklasse Java Basics - Anfänger-Themen 4
P Problem beim Thread Java Basics - Anfänger-Themen 20
0 problem beim Polygon zeichnen Java Basics - Anfänger-Themen 3
V Problem beim erstellen eines ausführbaren Programs Java Basics - Anfänger-Themen 5
0 Problem beim Starten des Applets Java Basics - Anfänger-Themen 2
N Problem beim Durchsuchen einer LinkedList Java Basics - Anfänger-Themen 5
G Problem beim Programmieren von Blackjack Java Basics - Anfänger-Themen 15
R Problem beim Laden eines Images Java Basics - Anfänger-Themen 7
K Problem beim installieren des JDK 1.6+ version Java Basics - Anfänger-Themen 3
T Problem beim Konsolenstart Java Basics - Anfänger-Themen 5
C Problem beim Berechnen der Quadratwurzel Java Basics - Anfänger-Themen 3
C Problem beim nutzen von Teilprogrammen in main Java Basics - Anfänger-Themen 2
M Problem beim Zeichnen Java Basics - Anfänger-Themen 5
D Problem beim Kompilieren Java Basics - Anfänger-Themen 4
G Problem beim Schreiben in Textdatei Java Basics - Anfänger-Themen 9
F ggT finden - problem beim qc Java Basics - Anfänger-Themen 4
S Problem mit url, inputStream und bytes beim Quellcode laden. Java Basics - Anfänger-Themen 6

Ähnliche Java Themen

Neue Themen


Oben