# .txt Datei einlesen und verarbeiten



## Alexander87 (6. November 2009)

Hi Community,

ich arbeite derzeit an einem Projekt, in dem ich eine Fehlerliste brauche. Hierbei werden eigentlich nur die FehlerID's eingetragen.

Eine Routine zum Fehler speichern habe ich soweit geschrieben.

Alle Fehler, die in der Liste stehen müssen der Reihe nach an eine Oberfläche übertragen werden und dabei muss der FehlerID die passende Fehlermeldung zugewiesen werden.
Die Fehlermeldungen habe ich in einer .txt-Datei stehen, die Struktur kann ich aber abändern ,falls meine Auflistung ungünstig gewählt ist.
Diese sieht so aus (die FehlerID ist aber keine fortlaufende Liste, es gibt also Zahlensprünge): 

              1 Luftdruckfehler
              2 Lesefehler
              ....

Jetzt die Frage, wie lese ich am besten die Datei ein, um anschließend den gelisteten FehlerID's die entsprechende Meldung zu zuweisen?

Hierzu muss ich jetzt sagen, dass ich zum einlesen bereits eine Grundstruktur habe, jedoch weiß ich nicht genau, wie ich das Eingelesene am besten abspeichere um damit diese ID-Vergleiche zu starten.

Hier mal mein Code:


```
ublic void readErrorFile()
	{

		FileInputStream in;
		try {
			in = new FileInputStream(errorFile);
			DataInputStream is = new DataInputStream(in);
			InputStreamReader fileReader = new InputStreamReader(is);
			BufferedReader errList = new BufferedReader(fileReader);
			
			while(n<nmax)
			{
				zeile = errList.readLine();
				if(zeile == null) { break; }
				errorArray[n] = ""+zeile;
				n++;
				
			}
		} catch (FileNotFoundException e){
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
```

Wenn ich mich nicht irre, wird hier das Textfile zeilenweise eingelesen und in meinem errorArray gespeichert.
Also wäre dann errorArray[0] = "1 Luftdruckfehler" ?!

Ich hoffe ich habe mein Problem deutlich genug beschrieben, wäre echt cool, wenn ihr mir helfen könnt!!

Grüße Alex


----------



## vfl_freak (6. November 2009)

Moin,

Du musst Dein Array natürlich auch irgendwo deklarieren und initialiseren ! 

etwa so:


```
// ersetze 'x' durchdie gewünschte max. Anzahl ! 
String[] arrayError = new String[x];
```

Gruß
Klaus


----------



## Matthias Reitinger (6. November 2009)

Hallo Alex,

wenn ich das richtig verstanden habe, suchst du eine Datenstruktur, die einen Assoziativspeicher implementiert. Dazu gibt es ein Kapitel in „Java ist auch eine Insel“, das dir weiterhelfen könnte.

Grüße,
Matthias


----------



## Alexander87 (6. November 2009)

Die Deklaration meines Arrays habe ich global abgehandelt, hier habe ich nur meine Methode gepostet, welche die File einliest. ;-)

Alle Variablen sind vorhanden. Die Fehlerliste soll einmal am Programmstart ausgeführt werden (ist bereits eingearbeitet) und dann soll dieser Array für die komplette Sitzung nur noch zum Auslesen bereit stehen.
Würde ich den Array in der Methode erstellen, würde dieser doch nach abarbeitung wieder gelöscht werden?

Zur Rückgabe der Message gibt es momentan leider noch keine gescheite Methode.
Meine momentane Überlegung ist, dass ich in einer "public String getErrorMSG(int ID)" Methode die ersten beiden Zeichen des errorArray[ i ] auslese und mit der FehlerID vergleiche, wenn das dann wahr ist, soll der Textteil ausgelesen werden von errorArray[ i ] als String zurückgegeben werden.

War meine Problembeschreibung wohl doch nicht so gut :-(

Gruß Alex


----------



## Alexander87 (6. November 2009)

So, meine Hirnwindungen haben mich auf eine neue Idee gebracht , muss dazu nur die .txt Datei ein wenig abändern, ich hoffe so funktioniert alles.

    Neues Format: 1% Druckluftfehler

Hier mal mein gedachter Ablauf, wär schön, wenn ihr eine kurze Bewertung der Idee abgeben könntet.


```
1. Ich lese eine Zeile aus der .txt Datei aus.
--> zeile = "1% Druckluftfehler"

2. Ich splitte den String auf
--> String arr[] = zeile.split("%");

3. Ich weise die gesplitteten Teile neuen Variablen zu
--> errID = arr[0];
--> errMSG = arr[1];

4. Ich speichere diese Variablen in einer HashMap (Danke für den Tipp mit den Maps, ist echt eine richtig coole Sache, sehr zu empfehlen)
--> errorList.put(errID, errMSG);
```

Jetzt habe ich ja im Prinzip eine schöne Datenstruktur mit FehlerID und der dazugehörigen Fehlermeldung.

Kommt jetzt ein Anfrage nach der Meldung muss ich nur noch auf die HashMap zu greifen.

Falls jemand aber noch Verbesserungsvorschläge hat, ich bin ganz Ohr

Gruß Alex


----------



## Matthias Reitinger (6. November 2009)

Alexander87 hat gesagt.:


> ```
> 1. Ich lese eine Zeile aus der .txt Datei aus.
> --> zeile = "1% Druckluftfehler"
> 
> ...


Wenn du das Format mit dem Prozentzeichen beibehalten willst, solltest du String.split noch ein Limit mitgeben, damit eventuelle Prozentzeichen in der Fehlerbeschreibung nicht zu Problemen führen (also konkret zeile.split("%", 2)).

Außerdem wäre es zu überlegen, ob eine HashMap<Integer, String> nicht effizienter wäre. Dazu müsstest du beim Einlesen die ID noch in einen Integer konvertieren.

Das Erzeugen des BufferedReaders zum Einlesen der Datei lässt sich übrigens auch abkürzen:

```
errList = new BufferedReader(new FileReader(errorFile));
```

Grüße,
Matthias


----------



## Anime-Otaku (7. November 2009)

Vielleicht solltest du aber statt split lieber indexOf benutzen. Dann bekommst du den Index zu diesem Zeichen zurückgegeben. Und dann kannst du mittels substring dir die Fehlermeldung die Fehlermeldung holen.

Ansonsten kann es ja theoretisch vorkommen, dass in deiner Fehlermeldung auch ein % Zeichen vorkommt und du dannn das Ergebnis abschneidest.

Oder schau dir den Lösungsvorschlag von Matthias an ;-)


----------



## Alexander_87 (9. November 2009)

Hi,

danke für die Vorschläge, hilft mir auf jedenfall weiter
In ein paar Testläufen hat auch alles wunderbar geklappt 

Gruß Alex


----------

