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
Klasse SpaceFilterReader - Wandelt Zeichen (außer: 0-9, a-z, A-Z, Umlaute) in Leerzeichen um
Klasse WordFilterReader - Trennt den Strom nach Worten
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;
}
}