Textdatei stückweise einlesen

Shorayne

Mitglied
Hallo,

ich bin grad echt am verzweifeln. Ich versuche aus einer Textdatei, welche folgenden Aufbau hat Werte auszulesen.

Beispielzeile in Anführungsstrichen:

"51100210 Holzfenster einfach 6*15 ST 0160 0800 150 Vereinigte Bauelementewerke Hennigsdorf 0495.80 0629.25 0499.80 5"

Davon hat die Datei 20 Zeilen. Die erste Zahl ist Artikelnummer, dann Artikelbeschreibung, Mengeneinheit und so weiter. Ziel ist es die Werte der Zeilen einzulesen und zu speichern. Was sehr Hilfreich ist, ist das die einzelnen Werte eine feste Länge in der Textdatei haben.

Artikelbeschreibung z.Bsp. ist immer 30 Zeichen und Artikelnummer ganz am Anfang immer 8.

Ich habe es jetzt schonmal hinbekommen die kompletten Zeilen einzulesen und ausgeben zu lassen.

Java:
package artikel_package;

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

public class Artikel_class {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub

int p, m=0;
String [] zeile = new String [50];
int p1, p2;
double [] [] a = new double [50] [10];
int [] n = new int [50];
try { 
		 
 FileReader fr = new FileReader ("D://Programme/eclipse/Informatik/ARTIKEL.TXT");
 BufferedReader input = new BufferedReader(fr);
 zeile[m]=input.readLine();
 while  (zeile[m] !=null)
		  
 {   m=m+1; zeile[m]=input.readLine();   }
		 
 input.close();
		 

}

catch (IOException lesefehler) { 
System.out.println("LESEFEHLER"+lesefehler);
		 }

System.out.println(zeile[1]);

}}

Fragt bitte nicht was das da oben mit dem p1 und 2 etc. soll. Ich hab mir erstmaln paar Dinge aus meinen Unterlagen genommen und zusammengefriemelt. Er unterstreicht mir da auch einiges gelb.

Ich müsste halt wissen wie man nicht die ganze Zeile sondern die einzelnen Stücke ausliesst und meinetwegen in einer Matrix speichert. Also ich am Ende meinetwegen von Artikel 10 (steht in 10.Zeile) ich den Lagerbestand (ist der 4. Wert in der Zeile) einfach ausgeben kann. Als Matrix sollte das dann ja der gespeicherte Wert von [10][4] sein. So nach dem Prinzip etwa. Aber wie das gehen soll puhh ich weiss echt nicht weiter...

Falls wer seine Hilfe anbietet schonmal recht vielen Dank im vorraus
 
Hallo,
Ich müsste halt wissen wie man nicht die ganze Zeile sondern die einzelnen Stücke ausliess

Am besten du liest die ganze Zeile aus und dann kannst du mit
Java:
String[] wert = zeile.split(" ");
die Werte einzeln abspeichern. Wenn du dann noch ein Wert in int haben möchtest kannst du z.B. mit
Java:
int zahl = Integer.valueOf(wert[0]);
einen Wert zu integer casten.

Mfg
 
So einfach ist das leider nicht. Die Artikelbezeichnung kann auch Leerzeichen haben "Holzfenster einfach" 😉
Du mußt jeden Wert ein wenig anders auslesen und umformen (nach int und co.) Außerdem mußt Du aufpassen, wenn jemand einen Wert "vergißt", oder der Wert einfach Leer ist (Leerer String und so). Besser ist es, wenn die Textdatei ein Trennzeichen hätte, oder ihr Euch auf so etwas einigen könntet. Wenn die Datei von externen Leuten kommt, stelle Dich auf Fehler ein. Z.B. ein Wert läßt sich nicht nach int parsen. Die ganze Datei deswegen zu verwerfen wäre wohl nicht gut, die Zeile dagegen schon, man könnte die Artikelnummer loggen.
 
Einfach erst ganz einlesen und dann Zeile für Zeile parsen. Ich würde mir auch gleich eine passende Klasse Artikel schreiben...

Java:
			FileReader fr = new FileReader("D://Programme/eclipse/Informatik/ARTIKEL.TXT");
			BufferedReader input = new BufferedReader(fr);
			List<String> lines = new ArrayList<String>();
			String line = null;
			while ((line = input.readLine()) != null) {
				lines.add(line);
			}
			input.close();
			
			List<Artikel> allArtikels = new ArrayList<Artikel>();
			for(String rawArtikelData : lines){	
				Artikel artikel = processRawData(rawArtikelData);
				allArtikels.add(artikel);
			}

...
public Artikel processRawData(String rawArtikelData){
    // hier den String parsen, mit split oder Tokenizer
}

Da das ganze ja anscheinend eine Übung ist gehe ich mal davon aus das erstmal alle Zeilen vollständig sind und keine Fehler enthalten. Sonst halt noch ein Exceptionhandling in oder um das processRawData bauen.
 
Es soll eine Übung sein richtig, wobei Übung ja normalerweise nur für etwas gilt was man bereits gelernt hat. Es ist mehr ein schmeisen in kaltes Wasser.

Ich werd erstmal alle Tipps berücksichtigen und mich gegebenenfalls nochmal melden.

Vielen Dank erstmal soweit!
 
Wenn du die genauen Längen der Tokens weißt kannst du recht einfach parsen:

Java:
public class Test {

	final static int LENGHT_ART_NR = 8;
	final static int LENGHT_ART_NAME = 30;
	final static int LENGTH_ART_ANZ = 3;

	public static void main(String[] args) {
	
		
		String rawArtikelData = "51100210 Holzfenster einfach 6*15 ST 0160 0800 150 Vereinigte Bauelementewerke Hennigsdorf 0495.80 0629.25 0499.80 5";
		Artikel artikel = processRawData(rawArtikelData);

	}

	public static Artikel processRawData(String s){
		Artikel artikel = new Artikel();
		int index = 0;
		artikel.setNummer(s.substring(index,LENGHT_ART_NR));
		System.out.println(artikel.getNummer());
		index = LENGHT_ART_NR+1; // +1 für den space
		
		artikel.setName(s.substring(index,LENGHT_ART_NAME));
		System.out.println(artikel.getName());
		index += LENGHT_ART_NAME;
		
		//... usw
		return artikel;
	}
}


class Artikel{
	
	String nummer;
	String name;
	int anzahl;
	public String getNummer() {
		return nummer;
	}
	public void setNummer(String nummer) {
		this.nummer = nummer;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAnzahl() {
		return anzahl;
	}
	public void setAnzahl(int anzahl) {
		this.anzahl = anzahl;
	}
}

Das geht aber nur wenn du wirklich feste Längen in dem Daten String hast.
 

Zurück
Oben