# methode mehrfach automatisch ausfuehren



## Tsag (25. Mai 2011)

hallo,

vorab: 
den code kann ich leider nicht posten, da ich ihn momentan nicht zur verfuegung habe. wuesste aber auch nicht, ob das sinn macht, da er sehr lang ist.

ich habe ein programm geschrieben, welches eine textdatei einliest, die aus verschiedenen gleich aufgebauten abschnitten besteht. jeder abschnitt ist durch die zeichen ## getrennt und eindeutig anhand einer nummer Z zu benennen:

##
Z0002
zeile 1 dieses abschnitts
zeile 2 dieses abschnitts
...
zeile 42 dieses abschnitts
##
Z0003
...
zeile X dieses abschnitts
...
##

und so weiter 

der benutzer muss am anfang eine nummer eingeben, je nachdem welchen datensatz er ausgegeben haben moechte. die nummern gehen von Z0001 bis Z0999, wobei nicht alle nummern belegt sind (es fehlt z.b. Z0004). insgesamt sind es 500 Z-abschnitte.

idee hinter der sache ist, dass man eine nummer eingibt und dann mit dem abschnitt der zwischen dieser nummer bis zum folgenden ## (hier endet schliesslich ein abschnitt und dahinter beginnt ein neuer) arbeiten kann. es werden dann fuer diesen abschnitt bestimmte berechnungen durchgefuehrt. 
mit benutzereingabe funktioniert das auch alles soweit: benutzer gibt nummer ein, mehrere berechnungen werden ausgefuehrt und die ergebnisse auf der konsole ausgegeben.

allerdings stehe ich jetzt vor einer huerde, die ich auch nach tagen nicht loesen konnte:
ich moechte, dass alle datensaetze selbststaendig durchlaufen werden und dann eine simple tabelle (kein jtable o.ae., nur die werte getrennt durch tabs oder pipes oder sonst irgendwas) mit den ergebnissen meiner berechnungen ausgegeben wird. das ganze soll in ein einfaches *.txt-file.
klingt einfach, nicht wahr? ich schaffe es trotzdem nicht.

wie wuerdet ihr sowas realisieren?

der (fuer mich) sinnvollste ansatz war: eine schleife die 500 mal durchlaufen wird (da 500 abschnitte die jeweils einzeln berechnet werden sollen). wenn Z gefunden, durchlaufe abschnitt bis ## auftaucht: fuehre berechnungen aus, schreibe Z und ergebnisse in zeile 1 meiner tabelle. weiter zum naechsten Z und dort das gleiche, das ganze eben 500-fach.
aber da sowas partout nicht klappen will, wuerde ich gerne wissen ob es bessere ansaetze gibt. gerne auch mit java- oder pseudocode. momentan habe ich es nur geschafft, die einzelnen Z-nummern aus dem file auszulesen (einfach durchlaufen und wann immer ein Z auftaucht, diese zeile in ein array speichern). das untereinander auszugeben ist kein problem, aber wichtiger sind mir die berechneten werte.

momentan komme ich einfach nicht weiter, aber das kann doch so schwer nicht sein?!

danke fuer hilfe.


----------



## bone2 (25. Mai 2011)

die textdatei zeilenweise einlesen bis er er ein Z00xxx findet, dann alles bis zum nächsten ### einlesen, verarbeiten und wieder von vorne bis eof.
was genau klappt denn nicht? du musst doch nur dem Z alle zahlen bis ### lesen


----------



## Andi_CH (25. Mai 2011)

Indem ich eine kleines handliches Beispiel mache, das auch hier eingestellt werden kann.

Aber Grunsätzlich:
In einer Schleife Zeilenweise einlesen
- Wenn ## am Anfang steht prüfen ob die gefunden Zahl mit der eingegebenen übereinstimmt
- Wenn ja: heureka Abschnitt gefunden
- - In einer neuen Schleifen zeilenweise einlesen
- - Zeile verarbeiten, wenn nicht ### am Anfang steht
- - Wenn doch, abbrechen.

Das sind sicher nicht mehr als 50 Zeilen und können hier eingestellt werden.


----------



## Matthias K. (25. Mai 2011)

Hi, 
also zusammengefasst:
du speicherst alle relevanten Zeilen in ein Array.
Speicher doch einfach die berechneten Werte ebenfalls in ein Array.

Darauf speicherst du dann alle Werte in das neue Textdokument.
Ich würde dafür ein drittes Array nutzen, in dem die Werte zum String addiert werden:
String = Zeile + Wert;
Diese Strings schreibst du dann ins Textdokument.
Dafür nutzt du z.B.:


```
String objecttext="";
               for(int c=1; c<=500; c= c +1)
               {
                        objecttext = objecttext + StringArray[c];
               }

                String dateiName="DasDokument.txt";
		
		FileOutputStream schreibeStrom = null;
		try {
			schreibeStrom = new FileOutputStream(dateiName);
		} catch (FileNotFoundException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		}
	    for (int i=0; i < objecttext.length(); i++){
	      try {
			schreibeStrom.write((byte)objecttext.charAt(i));
		} catch (IOException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		}
	    }
	    try {
			schreibeStrom.close();
		} catch (IOException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		
		}
```

Hoffe, dass das gemeint ist.

Gruß,
Matthias


----------



## Tsag (26. Mai 2011)

danke fuer eure beitraege, denn die haben mir gezeigt dass mein ansatz an sich ja keine schlechte idee ist und der fehler nicht an der idee an sich liegt. dadurch habe ich das problem gefunden:
ich hatte meine variablen an einer falschen stelle zurueckgesetzt, sodass bei den berechnungen nur unsinn herauskam. irgenwann wird man einfach codeblind ^^
ich dachte irgendwann einfach, es laege generell an der idee, wie ich mein probem angegangen bin.

@ matthias k.
zu deinem beispiel haette ich eine frage: waere es effizienter anstatt mehrerer arrays ein mehrdimensionales array zu erstellen oder macht das keinen unterschied?
und wozu ueberhaupt noch ein extra array welches einen string erstellt? mir wurde mal gesagt, dass fuer grosse datenaetze (trifft in diesem fall zwar noch nicht zu, kann aber passieren) strings ziemlich am speicher und / oder der performance nagen.
man kann die werte doch direkt aus dem array holen und sofort ausgeben?


----------



## Matthias K. (26. Mai 2011)

Hi,
geht natürlich auch und ist besser, aber ich finde, dass es nicht so anschaulig ist.


----------



## Tsag (27. Mai 2011)

k, danke.


----------

