# Zeilen aus einer .txt-Datei auslesen und Variablen zuweisen



## Juhini19 (20. Dez 2014)

Hi,

ich möchte aus einer .txt-Datei Zeilen auslesen und den Inhalt verschiedenen Variablen zuweisen. Eine .txt-Datei sieht so aus:

OrderNr 541234
NachfolgendeNr 785136
X 4,774277136
Y 2,741269844
Z 1,447853664

Dabei sollen die Wörter OrderNr, NachfolgendeNr, X, Y und Z übersprungen werden und nur das was dahinter steht, der entsprechenden Variablen zugewiesen werden.

Die Variablen in Java sind aber die gleichen:
OrderNr (int), NachfolgendeNr (int), X (double), Y (double) und Z (double). 
Also soll z. B. 541234 der Variablen OrderNr zugewiesen werden.

Ich bin noch Anfänger und weiß gerade nicht, wie ich das mit dem Überspringen von Strings und dem Zuweisen der Werte machen kann.
Ich habe hier schon im Forum gesucht, aber noch nichts passendes gefunden. Oder kann man es mit startsWith() oder contains() machen?
Habt ihr eine Idee oder könnt ihr mir bitte einen Ansatz geben, wie ich das machen kann?

Ich bin bis jetzt nur so weit, dass der Inhalt der .txt-Datei ausgegeben wird. 
Die ausgelesenen Werte sollen dann später in einer Datenbank gespeichert werden. Den Code dafür habe ich schon geschrieben.


```
import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;


public class Test {
	
	public static void main(String args[])
	{
		Reader reader = null;
		try
		{
		  reader = new FileReader(path);
		  
		  for ( int txt; ( txt = reader.read() ) != -1; )
		     System.out.print( (char) txt );
		  
		  
		}
		catch ( IOException e ) {
		  System.err.println(e);
		}
		finally {
		  try { reader.close(); } catch ( Exception e ) { }
		}
	}
}
```


----------



## coco07 (20. Dez 2014)

Hey Juhini19,

es gibt eine sogenannte "Dokumentation", in der Klassen mit ihrem Zuständen und Verhalten dokumentiert sind.
Unter anderem gibt es eine Methode mit dem Namen "substring", welche überladen ist. Diese Methode gibt sogar einen String zurück, welchen du dann direkt in deine Variable vom Typ String clonen kannst.
Klick mich!

PS: Wenn du nicht weißt, wo der startIndex ist, hilft dir die Methode "indexOf" sicherlich weiter 

grüße coco07!


----------



## Foxei (20. Dez 2014)

Hi Java Kann das was du vor hast von Haus aus. Es nennt sich Properties. 
Wikipedia


----------



## Juhini19 (20. Dez 2014)

Hi,

vielen Dank für die schnellen Antworten.
Ich habe es mit den Properties versucht und es funktioniert sehr gut. Ich habe jedoch vergessen zu erwähnen, dass die Werte X, Y und Z die Grundlage für die Berechnung von drei anderen Werten sind. 
Ich habe versucht X, Y und Z in double zu konvertieren (siehe unten). Als Meldung bekomme ich dann aber java.lang.NumberFormatException: For input string: "4,774277136"

Was habe ich da falsch gemacht? Gibt es eine andere Möglichkeit um String in double zu konvertieren oder ist es bei den Properties nicht möglich?


```
try 
		{
			Properties properties = new Properties();
			BufferedInputStream stream = new BufferedInputStream(new FileInputStream(path));
			properties.load(stream);
			stream.close();
			String orderNr = properties.getProperty("OrderNr");
			System.out.println("OrderNr = " + orderNr);
			String nachfolgendeNr = properties.getProperty("NachfolgendeNr");
			System.out.println("NachfolgendeNr = " + nachfolgendeNr);
			double x = Double.parseDouble(properties.getProperty("X"));
			System.out.println("X = " + x);
			double y = Double.parseDouble(properties.getProperty("Y"));;
			System.out.println("Y = " + y);
			double z = Double.parseDouble(properties.getProperty("Z"));
			System.out.println("Z = " + z);
					
		}
		catch (Exception e)
		{
			System.out.println(e);
		}
```


----------



## Foxei (20. Dez 2014)

Doubles ins Java werden mit einem Punkt getrennt  Also nicht "4,774277136" sondern "4.774277136"
und mein Link ist scheinbar falsch gesetzt Sorry 
Wikipedia


----------



## Juhini19 (21. Dez 2014)

Danke  Ich habe es jetzt so gelöst:


```
try 
		{					
			Properties properties = new Properties();
			BufferedInputStream stream = new BufferedInputStream(new FileInputStream(path));
			properties.load(stream);
			stream.close();			
			
			int orderNr = Integer.parseInt(properties.getProperty("OrderNr"));
			System.out.println("OrderNr = " + orderNr);			
			
			int nachfolgendeNr = Integer.parseInt(properties.getProperty("NachfolgendeNr"));
			System.out.println("NachfolgendeNr = " + nachfolgendeNr);
			
			String stepX = properties.getProperty("X");
			stepX = stepX.replace(",", ".");
			double x = Double.parseDouble(stepX);
			System.out.println("X = " + x);
			
			String stepY = properties.getProperty("Y");
			stepY = stepY.replace(",", ".");
			double y = Double.parseDouble(stepY);
			System.out.println("Y = " + y);
			
			String stepZ = properties.getProperty("Z");
			stepZ = stepZ.replace(",", ".");
			double z = Double.parseDouble(stepZ);
			System.out.println("Z = " + z);				
		}
		catch (Exception e)
		{
			System.out.println(e);
		}
```

Das replace bei "stepX = stepX.replace(",", ".");" habe ich benutzt, weil die eingelesenen Dateien bei den Zahlen (z. B. 4,774)  immer ein Komma statt einem Punkt haben und doubles in Java ja immer mit einem Punkt getrennt werden.
Vielen Dank für deine Hilfe.


----------



## Juhini19 (21. Dez 2014)

Ist es eigentlich möglich einen Ordner als Dateipfad einzustellen, so dass mehrere Dateien eingelesen werden?


----------



## coco07 (21. Dez 2014)

Hast du meinen Kommentar eigentlich gelesen vorhin?
Ich erwähnte das Wort :"Dokumentation". Wieso schaust du nicht rein?

Grüße coco07!


----------



## Foxei (22. Dez 2014)

Hi ja die Möglichkeit gibt es auch du erstellt ein File so wie bei einer Datei auch und gibst aber keine Datei sondern einen Ordner an. Die Files kannst du dann mit einer For Schleife durcharbeiten 

```
File f = new File("C:/Programme");
File[] fileArray = f.listFiles();
```


----------



## Juhini19 (12. Jan 2015)

Das habe ich jetzt auch soweit hinbekommen. Ich habe jetzt aber noch ein Problem, bei dem ich nicht weiter komme.
In meinem ersten Beitrag habe ich geschrieben, dass eine Text-Datei so aussieht:

OrderNr 541234
NachfolgendeNr 785136
X 4,774277136
Y 2,741269844
Z 1,447853664


Das hat sich jetzt jedoch hierzu geändert:

[Datensatz 1]
OrderNr 321234
NachfolgendeNr 54636
X 6,784127136
Y 2,557829844
Z 7,263441664

[Datensatz 2]
OrderNr 942334
NachfolgendeNr 785136
X 4,774277136
Y 2,741269844
Z 1,447853664

[Datensatz 3]
OrderNr 541234
NachfolgendeNr 785136
X 8,236448136
Y 9,456339844
Z 3,541036554

Die Dateien haben jetzt immer eine unterschiedliche Anzahl von Datensätzen (min. 2, max. 4). Jeder Datensatz soll ausgegeben werden.
Ich habe es jetzt so gemacht, dass ich mit den Properties nach dem letzten Datensatz in der Datei gesucht habe und die Zahl (z. B. Datensatz 3 --> 3) in einer Variablen (anzahlDatensätze) gespeichert habe.
Ich habe es anschließend mit einer for-Schleife versucht. Das funktioniert aber leider noch nicht,
es wird immer nur der Inhalt vom letzten Datensatz ausgegeben (d. h. der Inhalt der vorherigen Datensätze wird immer überschrieben). Vielleicht ist es mit der for-Schleife auch nicht möglich, weiß ich aber nicht genau.

Hier mein Code:


```
String anzahlDatensätzeStep = properties.getProperty("[Datensatz");
anzahlDatensätzeStep = anzahlDatensätzeStep.replace("]", "");
int anzahlDatensätze = Integer.parseInt(anzahlDatensätzeStep);
System.out.println("Insgesamt hat die Datei " + anzahlDatensätze + " Datensätze");         	 
           	
            	for (int i = 1; i <= anzahlDatensätze; i++)
            	{
                
            	System.out.println("Datensatz: " + i);	
            	System.out.println();	
            	            	
            	int orderNr = properties.getProperty("OrderNr");
            	System.out.println("OrderNr = " + orderNr);     

                int nachfolgendeNr = properties.getProperty("NachfolgendeNr");
            	System.out.println("NachfolgendeNr = " + nachfolgendeNr);         	 
            	
                String stepX = properties.getProperty("X");
                stepX = stepX.replace(",", ".");
                double x = Double.parseDouble(stepX);
                System.out.println("X = " + x);
 
                String stepY = properties.getProperty("Y"); 
                stepY = stepY.replace(",", ".");
                double y = Double.parseDouble(stepY);
                System.out.println("Y = " + y);
 
                String stepZ = properties.getProperty("Z");
                stepZ = stepZ.replace(",", ".");
                double z = Double.parseDouble(stepZ);
                System.out.println("Z = " + z);	
}
```

Die Datei habe ich vorher mit dem JFileChooser geöffnet. In diesem Beispiel habe ich es so gemacht, dass nur eine Datei statt mehreren Dateien aus einem Ordner eingelesen werden.
Ich dachte erst, dass ich mit System.out.append die einzelnen Datensätze an die Ausgabe anhängen könnte. Das hat aber leider nicht funktioniert.

Kann mir bitte jemand helfen?
Vielen Dank im Voraus.


----------



## Foxei (13. Jan 2015)

Ich glaube du hast nicht ganz verstanden was eine Properties Datei macht. Sie lässt pro Bezeichnung also bei dir OrderNr, NachfolgendeNr, X, Y, Z nur einen Wert zu. Doppelte werte werden überschrieben.
Das was du machen möchtest sieht nach eine  Datenbank aus. als File gibt es das das xml File. Das kann mehrere Daten sätze.

Wenn du aber nur genau 3 Datensätze haben willst dann kannst du die namen einfach ändern.

[Datensatz 1]
OrderNrA 321234
NachfolgendeNrA 54636
XA 6,784127136
YA 2,557829844
ZA 7,263441664

[Datensatz 2]
OrderNrB 942334
NachfolgendeNrB 785136
XB 4,774277136
YB 2,741269844
ZB 1,447853664

[Datensatz 3]
OrderNrC 541234
NachfolgendeNrC 785136
XC 8,236448136
YC 9,456339844
ZC 3,541036554

Fazit wenn nur 3 Datensätze umbenenne sonst xml File.

Gruß Simon


----------



## Juhini19 (13. Jan 2015)

Ok, ich werde mich dann jetzt mal in das Thema XML einlesen. 
Gibt es denn sonst keine andere Möglichkeit?


----------

