Textfile durchlaufen und ersetzen

Status
Nicht offen für weitere Antworten.

magic_halli

Bekanntes Mitglied
Hi,

ich habe ein Textfile, welches ich zeilenweise durchgehe. In einem ersten Schritt habe ich bereits einige bekannte Strings darin mit Zahlenwerten ersetzt. Nun sieht das File so aus:
Code:
sigma = (1.0/5.0 + 2.0/6.0 + 10.0/4.0)
tau = (3.0/7.0 + 8.0/4.0 + 9.0/4.0)
sigma_v=sqrt(sigma^2+3*tau^2)
s_b=4.0/sigma_v
s_bv=6.0/sigma_v
Im nächsten Schritt gehe ich dieses wieder von Anfang an durch und schicke die rechte Seite der Gleichung in einen Formelparser und rechne mir somit sigma und tau aus. Diese Ergebnisse speichere ich in einer ArrayList(String, double) ab.
Dann will ich mir sigma_v ausrechnen, muss dazu aber erst das eben errechnete sigma und tau einsetzen, um es in den Formelparser zu schicken usw.
Ich weiß aber leider nicht recht, wie ich quasi zur Laufzeit mir ein Ergebnis ausrechne, es dann aber sofort in der nächsten (oder folgenden) Zeile(n) einsetze und wieder ausrechnen lasse. Ich erhalte immer eine Fehlermeldung vom Formelparser, dass die Formel nicht korrekt ist - das ist auch logisch, da ich eine nicht aufgelöste Formel (enthält noch Worte wie sigma und tau) hineinschicke!
Hier einfach mal der bisherige Code:
Code:
...
Parser14 parser14 = new Parser14();
ArrayList alZwischenErg = new ArrayList();
StringBuffer strBuffer = new StringBuffer();

File fi = new File(path + filename);
if(fi.exists()){
         BufferedReader buff = new BufferedReader(new FileReader(path + filename));
         //jede Zeile durchgehen
         //Startmarke gefunden...
         while ( (line = buff.readLine()) != null) {
                  String erg;
        	  String formel;
        	  //linker Teil der Gleichung - Zwischenergebnis
        	  erg = line.substring(0, line.indexOf("="));
        	  //rechter Teil der Gleichung ab '='
        	  formel = line.substring(line.indexOf("=")+1, line.length());
        	  //formel in Parser schicken, ausrechnen lassen und in alZwischenErg speichern
        	  try{ 
                        //in ergebnis steht das ausgerechnete Ergebnis der Gleichung, bspw. sigma oder tau
        	    	ergebnis = parser14.parse( formel );
        	  }catch(IllegalArgumentException err){
                        //Parser wirft Exception, da in Formel noch nicht alles ersetzt wurde!
        	        System.out.println("der Formelparser kommt mit der Eingabe nicht klar" + "\n");
        	  }
        	  //in ArrayList speichern
        	  alZwischenErg.add( new MyParameters( erg ,ergebnis.doubleValue() ) );

                  //hier die Strings mit den entspr. Werten ersetzen
        	  Iterator iter = alZwischenErg.iterator();
        	    		while(iter.hasNext()){ 
        	    			MyParameters data = (MyParameters) iter.next();
        	    			String sName = data.get_sParam();
        	    			double term = data.get_dParamValue();

        	    		    String liTeil = line.substring(0, line.indexOf("=")+1);
        	    		    String reTeil = line.substring(line.indexOf("=")+1, line.length());

        	    		    if( line.contains(sName) == true){
        	    		    	line = liTeil + reTeil.replaceAll( sName, (new Double(term).toString()) );
        	    		    } 
        	    		}
        	    		strBuffer.append(line + "\n");
         }
}

//hier dann noch den neuen strBuffer in ein neues Textfile schreiben, in dem dann alle vorkommenden Gleichungen ausgerechnet
//und die Zwischenergebnisse jeweils in den darauffolgenden Zeilen eingesetzt sind

Mein Problem ist einfach, dass ich nicht sicher bin, ob das vom Prinzip her funktionieren würde, oder ob ich einige (wichtige) Sachen evtl. nicht bedacht habe.

Was meint ihr dazu - wie würdet ihr sowas angehen?

Danke und Gruß.
 
Was erwartet denn die Funktion "Parser14.parse()" für einen Parameter-Typ? Ich vermute mal (da du es nicht geschrieben hast ;-) ), dass die auftretende Fehlermeldung die aus dem catch-Block ist!?

Ich glaube, du verquickst da zwei Dinge miteinander: einmal das zahlenmäßige Ausrechnen der Formeln, das du natürlich benötigst, um die Variablen im String ersetzen zu können und dann noch die gerade schon genannte (String-)Ersetzung, die einfach nur der leserlichen Anzeige deiner Formeln dient.

Konkret:
Du setzt den String "sigma" gleich dem String (1.0/5.0 + 2.0/6.0 + 10.0/4.0). Um dein sigma_v berechnen zu können, benötigst du aber den Zahlwert von sigma, also 3.03333...

Eine mögliche Lösung könnte sein, den Formelparser zu erweitern, indem bereits bekannte Werte z.B. aus einem Hashtable geholt werden.

Code:
Hashtable<String, float> konstanten = new Hashtable<String, float>();
konstanten.put("sigma", 3.033);

Dein Parser prüft dann, ob z.B. "sigma" im Hash vorhanden ist und setzt dann den entsprechenden Wert in die Formel ein.
 
as erwartet denn die Funktion "Parser14.parse()" für einen Parameter-Typ?
...sie erwartet einen String. Das ist hier der rechte Teil der Gleichung. Darin dürfen aber nur Zahlenwerte vorkommen - und keine Wörter (außer natürlich pow, sqrt, sin usw.).

Der Formelparser ist hier aus dem Forum (von Beni geschrieben) :wink: . Darin will/kann ich aber nichts mehr ändern. Wenn, dann ändere ich nur was an meinem Code.
Ich speichere nach jeder Berechnung einer Formel den String (z.B. sigma) und den entspr. Zahlenwert in einer ArrayList ab.
Nur hab ich wahrscheinlich vom Ablauf her noch nicht den richtigen Algorithmus gefunden.
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben