1. Liebe Forumsgemeinde,

    aufgrund der Bestimmungen, die sich aus der DSGVO ergeben, müssten umfangreiche Anpassungen am Forum vorgenommen werden, die sich für uns nicht wirtschaftlich abbilden lassen. Daher haben wir uns entschlossen, das Forum in seiner aktuellen Form zu archivieren und online bereit zu stellen, jedoch keine Neuanmeldungen oder neuen Kommentare mehr zuzulassen. So ist sichergestellt, dass das gesammelte Wissen nicht verloren geht, und wir die Seite dennoch DSGVO-konform zur Verfügung stellen können.
    Dies wird in den nächsten Tagen umgesetzt.

    Ich danke allen, die sich in den letzten Jahren für Hilfesuchende und auch für das Forum selbst engagiert haben. Ich bin weiterhin für euch erreichbar unter tti(bei)pcwelt.de.
    Dismiss Notice

Problem beim Auslesen einer Textdatei, nebst Ausgabe

Discussion in 'Programmieren' started by Cranus, Apr 14, 2010.

Thread Status:
Not open for further replies.
  1. Cranus

    Cranus ROM

    Erstmal ein herzliches Hallo.

    Nun aber zum Kern meiner Frage.

    Ich habe folgende Aufgabe in der Schule erhalten.


    Grundlage hierfür ist eine Textdatei, in der Artikeldaten enthalten sind. Jede Textzeile hat folgenden Aufbau:
    Art.Nr.: 8 Zeichen
    Art.Bez.:30 Zeichen
    ME: 2 Zeichen
    MaxBest.:4Zeichen
    MinBest.:4Zeichen
    Herst.:41 Zeichen
    Preis:7Zeichen
    MaxPreis:7Zeichen
    MinPreis:7 Zeichen
    Lieferzeit:2Zeichen
    Zwischen den Angaben befindet sich jeweils ein trennendes Leerzeichen.

    besagte Textdatei:
    Code:
    51600226 Futtertuer TV-F14,5 9*20 R     ST 0684 0860 0150 Vereinigte Bauelementewerke Stralsund     1529.80 1595.80 1490.50 4
    51700227 Blendrahmentuer TG2-B 9*20 L   ST 0012 0480 0080 Forstwirtschaftsbetrieb Waren             1859.20 1899.00 1595.00 3
    51700228 Blendrahmentuer TG2-B 9*20 R   ST 0310 0480 0080 Forstwirtschaftsbetrieb Waren             1838.00 1899.00 1595.00 3
    52100230 Likolit-Belag Extra            QM 0100 2000 0500 Linoleumwerke Kohlmuehle                  0038.15 0047.95 0038.15 5
    52100231 Radeberger Treppenbelag        QM 0210 0800 0200 Bauproduktion Radeberg                    0029.55 0029.55 0028.95 1
    52100232 Stahl-Pur-Bit-Dachelement      QM 1150 3000 0800 Holz- und Leichtmetallbauelemente Leipzig 0109.95 0119.00 0099.30 1
    61100240 Brausekabine                   ST 0005 0080 0010 TGA Magdeburg                             0962.50 0983.45 0910.00 2
    61100241 Praezisionsverdunkl.-Anl.15*20 ST 0007 0160 0040 Licht- und Sonnenschutzanl. Friedrichroda 0316.60 0333.20 0316.60 5
    Löse folgende Aufgabe durch ein Java-Projekt:

    Es ist eine Artikelliste nach Bestandswerten (=Bestand * Preis) fallend sortiert auszugeben, die in der ME (Mengeneinheit) "QM" geliefert werden. Das Unterprogramm führe bei jedem Aufruf den Vergleich benachbarter Werte aus. Die Artikelbezeichnungen und die Mengeneinheiten(ME) sind mit aus zu geben, ebenso die prozentualen Abweichungen von den Max.- und Min.-Werten (bei Verwendund der Max.- bzw. Min.-Preisen).

    Ein gesondertes Unterprogramm soll die Daten aus der Textdatei lesen und bereitstellen.


    Code:
    package main;
    
    import java.io.*;
    import java.text.*;
    import java.util.*;
    
    
    public class main
    {
    
    		///**
    		 //* @param args
    		 //*/
    		public static void main(String[] args)
    		{
    			/** Das Programm liest alle Artikel mit Mengenangabe QM aus,
    			 *  berechnet den Bestandswert und Prozentuale Abweichungen und 
    			 *  sortiert fallend nach Bestandswerten mit dem Vergleich benachbarter Werte
    			 */
    			ArrayList<String> ArtikelListe = new ArrayList<String>(); //ArrayListe fŸr DatensŠtze
    			String Einzelartikel;
    			int z =0;
    			
    			//DecimalFormat uf = new DecimalFormat( "##,##0.00" );		// Formatierung für die Ausgabe, DiffEuro
    			//DecimalFormat zf = new DecimalFormat( "#0.00");				// DiffProz
    			DecimalFormat df = new DecimalFormat( "####0.00" );			// Formatierung
    			//DecimalFormatSymbols ds = new DecimalFormatSymbols();
    			
    			Einzelartikel = Einlesen(z);	//erster Aufruf UP Einlesen (vor der Schleife)
    			System.out.println(Einzelartikel);
    			if (Einzelartikel == "Fehler") System.out.println("Lesefehler");	//Fehlerausgabe
    					
    			while (Einzelartikel!= null)		//Beginn EndgeprŸfte while-Schleife
    			{
    				Artikel_Class Instanz = new Artikel_Class(Einzelartikel);	//Erzeugung neue Instanz der Klasse 
    																			//Artikel_Class und †bergabe des Inhalts
    																			//von String Einzelartikel	
    				//Einzelartikel = Instanz.Einzelartikel;	//†bernahme String Einzelartikel aus der Instanz
    			
    				//System.out.println(Instanz.Artikelnummer);
    				//System.out.println(Instanz.Artikelbezeichnung);
    				//System.out.println(Instanz.Mengeneinheit);
    				//System.out.println(Instanz.Bestand);
    				//System.out.println(Instanz.Maximalbestand);
    				//System.out.println(Instanz.Minimalbestand);
    				//System.out.println(Instanz.Hersteller);
    				//System.out.println(Instanz.Preis);
    				//System.out.println(Instanz.Maximalpreis);
    				//System.out.println(Instanz.Minimalpreis);
    				//System.out.println(Instanz.Lieferzeit);
    				System.out.println(Instanz.Bestandswert);
    				
    				
    				if (Instanz.Mengeneinheit == "QM")
    				{
    				//Einzelartikel = Einzelartikel+Instanz.Bestandswert+Instanz.ProzAbweichung;
    				
    					
    					Einzelartikel = Instanz.Artikelbezeichnung + " " + Instanz.Mengeneinheit + " " + Instanz.Bestand + " " + Instanz.Preis + " " + df.format(Instanz.Bestandswert) + " " + df.format(Instanz.ProzAbweichung);
    					
    					ArtikelListe.add(Einzelartikel);	//in die ArtikelListe aufnehmen
    					z = z+1;	//Zähler erhöhen		
    					Einzelartikel = Einlesen(z);	//UP Einlesen aufrufen
    				}
    				else
    				{
    					z = z+1;	//Zähler erhšhen		
    					Einzelartikel = Einlesen(z);	//UP Einlesen aufrufen
    				}
    
    				System.out.println(Einzelartikel);				
    				if (Einzelartikel == "Fehler") System.exit(0);	//falls UP Fehler zurückgibt, Abbruch Programm		
    			}
    			System.out.println(ArtikelListe);
    			
    			ArtikelListe = BubbleSort(ArtikelListe);	//UP Bubblesort sortiert ArtikelListe nach Bestandswerten
    			
    			System.out.println("Artikelbezeichnung    ME  Bestand   Preis   Best.Wert   Proz.Abweichung");
    			System.out.println();
    			System.out.println(ArtikelListe);
    					
    		}
    		
    		public static String Einlesen(int i)	//UP Einlesen wird gestartet
    		{
    			int pos = 126 * i;	//Deklaration & Initialisierung der Positionierungsvariable
    			
    			String Einzelartikel;	
    			try
    			{
    					File Datei = new File("ARTIKEL.txt");	//lesen der einzelnen Datensätze unter 
    					FileReader FileReader = new FileReader(Datei);	//Verwendung der try-catch Anweisung 
    					BufferedReader Reader = new BufferedReader(FileReader);	//(Exception-Handling)
    					
    					Reader.skip(pos);	//Positionierung auf nŠchstem Datensatz
    					Einzelartikel = Reader.readLine();	//Datensatz wird gelesen
    					
    					System.out.checkError();
    					Reader.close();	//Lesepuffer wird geschlossen
    					
    					return Einzelartikel;	//zurück zum rufendem Programm mit Datensatz
    											//wenn kein Datensatz mehr, dann gibt >null< zurück
    			}
    			catch(Exception Fehler)
    			{
    				System.out.println("Es trat folgender Fehler auf: " + Fehler);	//weitere Fehlerbehandlung erfolgt im HP
    				return "Fehler";
    			}
    		}
    		
    		
    		public static ArrayList<String> BubbleSort(ArrayList<String> ArtikelListe)
    		{
    			int Zeilenanzahl = ArtikelListe.size() -1;	//Bestimmt die anzahl der DatensŠtze in der Liste
    			
    			String String_A, String_B;	//Deklarieren der nštigen Variablen
    			Double BestWert_A, BestWert_B;
    			
    			//DecimalFormat uf = new DecimalFormat( "##,##0.00" );		// Formatierung für die Ausgabe, DiffEuro
    			//DecimalFormat zf = new DecimalFormat( "#0.00");				// DiffProz
    			
    			
    			for (int i=0; i < Zeilenanzahl; i++)
    			{
    				for (int j=0; j < Zeilenanzahl; j++)
    				{
    					String_A = ArtikelListe.get(j);	//zu vergleichende String aus der Liste entnehmen
    					String_B = ArtikelListe.get(j+1);
    					
    					BestWert_A = Double.parseDouble(String_A.substring(44,52));	//Bestandswert aus Strings auslesen
    					BestWert_B = Double.parseDouble(String_B.substring(44,52));
    					
    					if (BestWert_B < BestWert_A)	//Ist Bestandswert B kleiner als A?
    					{
    						ArtikelListe.set(j+1, String_A);	//dann vertausche Datensätze
    						ArtikelListe.set(j, String_B);
    					}
    				}
    			}
    				return ArtikelListe;	//fallend sortierte ArtikelListe zurück an HP
    		}
    	}
    Dazu habe ich die Artikel_Class programmiert, in der die Positionierung und Formatierung der einzelnen Strings festgelegt wird.

    Code:
    package main;
    
    import java.text.*;
    
    public class Artikel_Class	//KLasse wird deklariert
    {
    	//Klassenvariablen werden deklariert (Bestandteile von ARTIKEL.txt)
    	String Artikelbezeichnung, Hersteller, Mengeneinheit;
    	int Artikelnummer, Bestand, Minimalbestand, Maximalbestand, Lieferzeit;
    	double Preis, Maximalpreis, Minimalpreis, Bestandswert, MinBestandswert, MaxBestandswert, ProzAbweichung;
    	public String Einzelartikel;	//Einzelartikel als String definiert
    	
    	DecimalFormat df = new DecimalFormat( "####0.00" );			// Formatierung
    	DecimalFormatSymbols ds = new DecimalFormatSymbols();
    	
    	//Anfang Konstruktor
    	
    	
    	public  Artikel_Class(String Artikelzeile)
    	{
     		Artikelnummer=Integer.parseInt(Artikelzeile.substring(0,8));
     		Artikelbezeichnung=Artikelzeile.substring(9,39);
     		Mengeneinheit=Artikelzeile.substring(40,42);
     		Bestand=Integer.parseInt(Artikelzeile.substring(43,47));
     		Maximalbestand  = Integer.parseInt(Artikelzeile.substring(48,52));
     		Minimalbestand = Integer.parseInt(Artikelzeile.substring(53,57));
     		Hersteller= Artikelzeile.substring(58,98);
     		Preis= Double.parseDouble(Artikelzeile.substring(99,107));
     		Maximalpreis= Double.parseDouble(Artikelzeile.substring(108,114));
     		Minimalpreis= Double.parseDouble(Artikelzeile.substring(115,123));
     		Lieferzeit = Integer.parseInt(Artikelzeile.substring(124, 125));
    		
     		ds.setDecimalSeparator('.');								// Setzt Dezimaltrennzeichen auf '.'
     		df.setDecimalFormatSymbols(ds);								// notwenig für Konvertierung String -> Double
    
     		//Umsatz = Math.round(Preis * Stck * 100) / 100.;
     		//Einzelartikel = df.format(Umsatz) + " " + Anr + " " + Abez;			
     		
     		
     		
     		Bestandswert = Math.round(Preis * Bestand);
     		MinBestandswert = Minimalbestand * Minimalpreis;
     		MaxBestandswert = Maximalbestand * Maximalpreis;
     		ProzAbweichung = Math.round(MinBestandswert * 100) / MaxBestandswert;
     		Einzelartikel = Artikelbezeichnung + " " + Mengeneinheit + " " + Bestand + " " + Preis + " " + df.format(Bestandswert) + " " + ProzAbweichung;
    		
    	}	
    }
    
    
    
    Zum einen liest er zwar die TXT Datei aus, gibt aber entweder alle Datensätze aus, keinen, oder er nimmt immer 1 Zeichen beim nächsten String weg, sprich Datensatz 2 hat 1 Zeichen weniger, usw.

    Was es nun tun soll; es soll die TXT Datei nach allen Datensätzen durchsuchen, also er überprüft alle Datensätze, und soll im Endeffekt nur die Datensätze ausgeben, deren Mengeneinheit "QM" ist.

    Ich weiß nicht mehr weiter, bitte helft mir, es ist sehr wichtig, da mir die Zeit wegrennt. Vielen Dank
     
Thread Status:
Not open for further replies.

Share This Page