File auslesen

  • Themenstarter Themenstarter nino1
  • Beginndatum Beginndatum
Status
Nicht offen für weitere Antworten.
N

nino1

Gast
Hiho,

Folgendes Problem:

Ich habe ein File, welches so aussieht🙁Daten sind egal😉)
[Erdbeere]
TestVar1=123456
TestVar2=0
TestVar3=CHF
Testvar4=100

[Schokoladenpudding]
Schoko1=123456
Schoko2=0

Nun will ich zu jedem dieser Abschnitte(Erdbeere und Schokoladenpudding) die zugehörigen Werte. D.h ich möchte gerne irgendwie wissen, nachdem ich das File gelesen habe, dass ich die Nachricht vom Typ Erdbeere habe mit den Werten TestVar1 = 123456 etc. Wie mache ich das am einfachsten, so dass ich am Schluss alle diese Daten zur Verfügung habe.
Ich weiss, wie ich das File lesen kann, mir geht es darum, wie ich es am einfachsten handhabe, dass ich danach alle Daten zur Verfügung habe. Man muss sich auch vorstellen, dass nach Schokoladenpudding nopchmals eine leere Zeile kommen könnte und danach wieder ein anderes Produkt wie zum Beispiel [Gurkensalat]. Das File ist übrigens immer gleich aufgebaut. Also [Produkt], danach auf einer Anzahl von x Zeilen gibt es diese Werte, danach wieder eine Leere Zeile. Ich habe mir schon überlegt, dies irgendwie mit einem Hash zu lösen, welchem ich dann als Schlüssel z.B TestVar1 gebe und dann als Wert 123456. Nur fehlt mir dann das Produkt zwischen den Klammern.

Dazu kommt noch eine Frage:
Wenn ich die Zeile "TestVar1=123456" ausgelesen habe, wie schaffe ich es, dass ich diese Zeile so trenne, dass ich in einer Variable "TestVar1" habe, und in der anderen "123456"?

Vielen Dank für die Hilfe.

Gruss,
Ninu
 
1.
Das nächste Produkt erkennst du doch schon an '['. Also musst du nur das zwischen '[' und ']' auslesen und du weißt, zu welchem Produkt die nachfolgenden Werte gehören.

2.
Wenn du "TestVar1=123456" aufteilen willst, such dir doch einfach die Position von '='. Links davon ist der Variablenname, rechts der Wert
 
Also wie das gesamte Einlesen am praktischsten geht weiss ich auch nicht, wär aber auch neugierig drauf

nino1 hat gesagt.:
Wenn ich die Zeile "TestVar1=123456" ausgelesen habe, wie schaffe ich es, dass ich diese Zeile so trenne, dass ich in einer Variable "TestVar1" habe, und in der anderen "123456"?

Also das kannste mit substringing machen,
Code:
String mystring="TestVar1=123456";
String name=mystring.substring(0, mystring.indexOf("="));
String wert=mystring.substring(mystring.indexOf("=")+1, mystring.length());
kann aber sein das es je nach dem wie du das Einlesen am praktischsten regelst auch praktischer lösbar wäre. :wink:

Ist aber insgesamt auch interessant für mich weil ich ähnliche Datein lade und verarbeite, und ich mach das dann so ungefähr:
Code:
	try{
		br = new BufferedReader(new FileReader(e.getPath()+"/config/database.txt"));
		
		while((line = br.readLine())!= null)
	    {
	    	StringTokenizer tokenizer = new StringTokenizer( line, " " );
	    	String str[] = new String[2];
	    	
	    	if(tokenizer.hasMoreTokens()){
	    		 	for ( int i = 0; tokenizer.hasMoreTokens(); ++i ){
	    		 		str[i] = tokenizer.nextToken();
	    		 	}
	    		if(str[0].equals("TestVar1")){
		    		System.out.println("TestVar1="+str[1].toString());
		    	}		    	}
	    }
				    br.close();
    }catch(FileNotFoundException fnfe){
    	System.err.println("Datei nicht gefunden...");	    
    }catch(IOException ioe){
    	System.err.println("Probleme beim Lesen...");	    
    }

vielleicht hilfts dir ja 🙂

Oh, und das von Dako musste auch beachten wegen dem []
 
DaKo hat gesagt.:
1.
Das nächste Produkt erkennst du doch schon an '['. Also musst du nur das zwischen '[' und ']' auslesen und du weißt, zu welchem Produkt die nachfolgenden Werte gehören.

2.
Wenn du "TestVar1=123456" aufteilen willst, such dir doch einfach die Position von '='. Links davon ist der Variablenname, rechts der Wert

1.Leider weiss ich nicht einmal, wie ich nur zwischen [ und ] auslesen könnte. Aber dann hätte ich doch das Problem, dass ich gar nicht weiss, wieviele Zeilen danach folgen? Wie lese ich denn [Erdbeere] aus und danach alle Werte bis zum nächsten [Produkt]? Und immer noch die Frage, wie ich diese Werte dann am besten speichere, damit ich weiss, dass sie zueinandergehören. Also damit ich weiss, dass Erdbeere TestVar1-TestVarx hat mit den dazugehörigen Werten.

2.Gibt es in Java keine Splitfunktion, die mir nach "=" aufteilt und mir die Teilung in je einer Variable speichert?
In Perl funktioniert das so ähnlich:
($fn, $ln) = split("=", $in);

Dann splitte ich $in nach "=" und habe in $fn und $ln meine beiden Werte.
 
Hmm vielleicht wär auch so was wie ein XML-Loader ganz gut dafür. Hab aber keine Erfahrung damit. Aber ich glaub der macht so was ähnliches wie die brauchst schon, nur halt mit XML
 
para_ hat gesagt.:
steht doch alles in azrahels post

Der Post war noch nicht da, als ich das gerade am schreiben war😉

Falls jemand noch eine Idee hat, wie ich das am besten regle - immer gerne🙂
 
1. Solange es was zu lesen gibt
1.1 gesamte Zeile einlesen
1.2 Ist das erste Zeichen '[' ?
1.3 [Ja]
1.3.1 Dann entferne '[' und ']' aus der Zeile
1.3.2 Was übrig bleibt, ist der Produktname
1.4 [Nein]
1.4.1 Ist '=' enthalten?
1.4.2 [Ja]
1.4.2.1 Dann trenne Variable und Wert und speichere beides
Anmerkung
Da du nicht weißt, wieviel Variablen-Wert-Paare du hast, verwende einfach eine java.util.Map
1.4.3 [Nein]
1.4.3.1 Dann muss es eine Leerzeile sein 😉

Hoffe, das ist verständlich 🙂
 
Ich weiß ja nicht ganz genau wie dynamsch das ganze sein soll bzw. wie das verwendet und editiert werden soll. Baer zwei Sachen fallen mir auf anhieb ein:


-Objekte speichern

Wenn "Erdbeere" später in Form eines Objekts verwendet werden soll, das folgende Attribuet hat TestVar1=123456, TestVar2=0, TestVar3=CHF, Testvar4=100, dann solltest du am besten in deiner Klasse Erdbeere das Interface serilizable implementieren. dadurch kannst du Objekte von dem Type wegschreiben und später wieder auslesen. (Du kannst in der textdatei allerdins keine neuen Objekte händisch anlegen)



-properties-Dateien

Wenn du im Programm die Werte der "Variablen" brauchst, dann kannst du die ganz einfach über einen propertie-file einlesen:

Klasse zum einlesen:

Code:
public final class Bundle {

    /**
     * Die Properties-Datei (package + dateiname).
     */
    private static final String BUNDLE_NAME = "tesz.ressources.project";

    /**
     * Das eingelesene Ressource Bundle.
     */
    private static final ResourceBundle RESOURCE_BUNDLE = ResourceBundle
            .getBundle(BUNDLE_NAME);

    /**
     * Funktionale Klasse zum Bereitstellen einer Propertie-Datei, dehalb werden
     * Instanzen verhindert.
     */
    private Bundle() {
    }

    /**
     * Liest den Wert des übergebenen Schlüssels aus dem Ressource Bundle ein,
     * wandelt ihn in einen Integer um und gibt ihn zurück. Wird der Schlüssel
     * nicht gefunden oder kann der Wert nicht umgewandelt werden, wird 0
     * zurückgegeben.
     * 
     * @param key
     *            der Schlüssel des gesuchten Werts
     * @return der gesuchte Integer Wert
     */
    public static int getInt(final String key) {
        try {
            return Integer.parseInt(RESOURCE_BUNDLE.getString(key));
        } catch (MissingResourceException e) {
            return 0;
        } catch (NumberFormatException nfe) {
            return 0;
        }
    }

    /**
     * Liest den Wert des übergebenen Schlüssels aus dem Ressource Bundle ein
     * und gibt ihn als String zurück. Wird der Schlüssel nicht gefunden wird er
     * von Ausrufezeichen umschlossen zurückgegeben.
     * 
     * @param key
     *            der Schlüssel des gesuchten Werts
     * @return der gesuchte String Wert
     */
    public static String getString(final String key) {
        try {
            return RESOURCE_BUNDLE.getString(key);
        } catch (MissingResourceException e) {
            return '!' + key + '!';
        }
    }
}

Die propertie datei:

Code:
test.int=42
test.string=hallo

[code]


der aufruf:

[code]
String test1 = Bundle.getString("test.string");   
int test2 = Bundle.getInt("test.int");
 
Ich habe es nun einmal irgendwie versucht zusammenzustellen aus den ganzen Antworten. Naja, für Profis sieht das wohl jetzt ein wenig nach ner Katastrophe aus😉



Code:
BufferedReader br = new BufferedReader(new FileReader("Geldautomat1.txt"));

        String line;
        while((line = br.readLine()) != null) {
            StringTokenizer T = new StringTokenizer(line);

            for(int i = 0; T.hasMoreTokens(); ++i) {

                str[i] = T.nextToken();
                // System.out.println("Token" + i +": " + str[i]);
                if(str[i].substring(0, 1).equals("[")) {
                    Typ = str[i].substring(1, str[i].indexOf("]"));
                    System.out.println("TYP: " + Typ);
                }
                else if(str[i].indexOf("=") != -1) {
                    String name = str[i].substring(0, str[i].indexOf("="));
                    String value = str[i].substring(str[i].indexOf("=") + 1, str[i].length());
                    if(Typ.equals("Erdbeere")) {
                        hashTyp1.put(name, value);
                        System.out.println(name + ": " + hashTyp1.get(name));
                    }
                    else if(Typ.equals("Schoko")) {
                        hashTyp2.put(name, value);
                        System.out.println(name + ": " + hashTyp2.get(name));
                    }
                    else if(Typ.equals("IPod")) {
                        hashTyp3.put(name, value);
                        System.out.println(name + ": " + hashTyp3.get(name));
                    }
                    else if(Typ.equals("Telefon")) {
                        hashTyp4.put(name, value);
                        System.out.println(name + ": " + hashTyp4.get(name));
                    }
                    else if(Typ.equals("Buch")) {
                        hashTyp5.put(name, value);
                        System.out.println(name + ": " + hashTyp5.get(name));
                    }
                }
            }
        }

So habe ich schlussendlich in Typ immer mein Produkt ohne Klammern und in den verschiedenen Hashtabellen habe ich per Schlüssel und Wert meine Daten. Der Haken an der Sache: Wenn mein File so aussieht:

Code:
[Erdbeere]
TestVar1=123456
TestVar2=0
TestVar3=CHF
Testvar4=100

[Schokoladenpudding]
Schoko1=123456
Schoko2=0 


[Erdbeere]
TestVar1=5343434
TestVar2=0
TestVar3=CHF
Testvar4=100

...habe ich das Problem, dass ich 2x einen Hash von Typ1 habe und somit in einem anderen File(wo das hier aufgerufen wird) nur noch die letzten Einträge von der Erdbeere habe. Ansonsten wäre alles perfekt:/ Und diese Situation kann und wird vorkommen.
 
1.
Um ein einzelnes Zeichen aus einem String auszulesen, gibt es charAt(int index)

2.
Ich würde es spontan über eine Map<String,Map<String,String>> machen. D.h. ich würde das ganze File in eine Map packen, deren Keys die Produktnamen sind. Wenn es mehrere Produkte mit selben Namen gibt (z.B. Erdbeere) kann man diese ja durchnummerieren.
Die innere Map sind dann die Namen-Wert-Paare aus der Datei.
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben