Ausschneiden < Fortran < Programmiersprachen < Praxis < Informatik < Vorhilfe
|
Status: |
(Frage) beantwortet | Datum: | 20:41 Mo 29.03.2010 | Autor: | Tyskie84 |
Hallo zusammen,
bin ein absoluter Fortran Neuling, eigentlich generell mit Programmmierspachen. Also ich hab folgendes Problem und wollte erfragen ob dies mit Fortran möglich ist. Im Anhang befindet sich eine kleine txt Datei.
In dieser Datei wurden von 5 Stationen meteorlogische Parameter aufgezeichnet. Ich möchte nun für jede Station eine Datei rausgeschrieben haben sodass ich am ende aus der einen Datei insgesamt 5 habe.
Im Internet habe ich mich mal schlau gemacht wie ein Programm überhaupt aufgebaut ist und so weit bin ich gekommen:
c PROGRAM
IMPLICIT NONE
c ************************
c *Variablenvereinbarung
c ************************
c STN = Station number
c WBAN = Weather Bureau Air Force Navy
c TEMP = Mean temperature in degrees Fahrenheit
c DEWP = Mean dew point in degrees Fahrenheit
c SLP = Mean sea level pressure in millibars
c STP = Mean station pressure in millibars
c VISIB = Mean visibility in miles
c WDSP = Mean wind speed in knots
c MXSPD = Maximum sustained wind speed in knots
c GUST = Maximum wind gust in knots
c MAX = Maximum temperature during the day in Fahrenheit
c MIN = Minimum temperature during the day in Fahrenheit
c PRCP = Total precipitation during the day in inches
c SNDP = Snow depth in inches
c FRSHTT = Indicators see readme.txt
PARAMETER (M=600000)
INTEGER i,M
INTEGER stn(M),wban(M),date(M)
REAL temp(M),dewp(M),slp(M),stp(M),visib(M),wdsp(M)
REAL mxspd(M),gust(M),maxi(M),mini(M),prcp(M),sndp(M)
REAL frshtt(M)
CHARACTER
OPEN(10,file="...../GSMO.txt")
DO i=2,M
READ(10,'(A6,X,A5,2X,A8,2X,A6,5X,A5,5X,A6,
> 5X,A6,5X,A5,5X,A5,5X,A5,2X,A4,2X,A5,X,A6,X,A5)')
> stn(i),wban(i),date(i),temp(i),dewp(i),slp(i)
> stp(i),visib(i),wdsp(i),mxspd(i),gust(i),maxi(i)
> mini(i),prcp(i),sndp(i),frshtt(i)
ENDDO
CLOSE(10)
Wenn ich nicht irre dann habe ich zunächst nur die Datei eingelesen. Wie sage ich nun dass er mir nur diese Stationen rausschreiben soll? Achja Die Stationnummer ist in Spalte 1-6.
Irgendwie muss ich ihm ja sagen, wenn die ersten 6 Spalten gleich sind dann soll er eine Datei rausschreiben. Nur es happert bei mir an der Umsetzung.
Ich hoffe jmd kann mir mit meinen bescheidenen, wobei dass schon zu viel gesagt ist, weiterhelfen.
Gruß
Station
Dateianhänge: Anhang Nr. 1 (Typ: txt) [nicht öffentlich]
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 23:54 Mo 29.03.2010 | Autor: | chrisno |
Heute habe ich keine Zeit mehr dafür. Ich kann Dir jetzt nur sagen, dass das auf jeden Fall in Fortran ohne größeren Aufwand lösbar ist.
|
|
|
|
|
Status: |
(Antwort) fertig | Datum: | 11:55 Di 30.03.2010 | Autor: | chrisno |
Hallo,
heutzutage würde ich das mit einem Perl-Skript machen. Wenn Du aber noch weiter mit Fortran arbeiten wirst, ist das sicher ein guter Einstieg.
PROGRAM SEPERATE_STATIONS
C Autor: .... ausfüllen
C Date: ....
C This tiny Progam reads in the data of .... and writes them into one
C file for each of the five stations.
IMPLICIT NONE
C das schreibe immer hin, es spart so viel Mühe bei der Fehlersuche
c ************************
c *Variablenvereinbarung
c ************************
c STN = Station number
c WBAN = Weather Bureau Air Force Navy
c TEMP = Mean temperature in degrees Fahrenheit
c DEWP = Mean dew point in degrees Fahrenheit
c SLP = Mean sea level pressure in millibars
c STP = Mean station pressure in millibars
c VISIB = Mean visibility in miles
c WDSP = Mean wind speed in knots
c MXSPD = Maximum sustained wind speed in knots
c GUST = Maximum wind gust in knots
c MAX = Maximum temperature during the day in Fahrenheit
c MIN = Minimum temperature during the day in Fahrenheit
c PRCP = Total precipitation during the day in inches
c SNDP = Snow depth in inches
c FRSHTT = Indicators see readme.txt
PARAMETER (M=600000)
INTEGER i,M
C Wenn Du imer nur eine Zeile liest und direkt wieder wegschreibst,
C benötigst Du nicht die Felder für die Daten
INTEGER stn, wban, date
REAL temp, dewp, slp, stp, visib, wdsp
REAL mxspd, gust, maxi, mini, prcp, sndp
REAL frshtt
c CHARACTER
OPEN( 10, file="...../GSMO.txt" )
C Du solltest überlegen, hier auch "read" in die open-Anweisung zu
C schreiben. Du hast natürlich eine Sicherungskopie, aber trotzdem
C rate ich dringend, nur lesend zuzugreifen, wenn Du nicht in diese
C Datei schreiben willst.
OPEN( 11, "write", file="Station1.txt")
OPEN( 12, "write", file="Station2.txt")
OPEN( 13, "write", file="Station3.txt")
OPEN( 14, "write", file="Station4.txt")
OPEN( 15, "write", file="Station5.txt")
C Das lässt sich auch noch viel schicker machen, aer wir bleiben erst
C einmal bei den Anfängen. Nun stehen die Dateien zum Schreiben offen.
C Ich empfehle Dir, die Laufzeitfehler abzufangen. Das heißt, auch den
C Parameter err= in allen open, close, read und write Anweisungen zu
C verwenden. Es kostet dreimal soviel Zeit das zu Programmieren. Es
C reduziert die Zeit bei der Fehlersuche auf ein Zehntel.
C Du versuchst vermutlich, mit dem i=2 die erste Zeile zu überspringen.
C Das wird nicht passieren. Es wird bei i = 2 die erste Zeile,
C der Header, eingelesen. Du musst einfach einmal "leer" lesen:
READ( 10 )
C Wenn Du allerdings neuen Dateien auch mit diesem Header versehen willst,
C dann definiere ein Character-Variable header(51) (selbst nachzählen bitte)
C Dann liest Du ein:
READ( 10, '(A51)' ) header
C und schreibst den Header in die neuen Dateien
DO I = 1, 5
WRITE( 10+I, '(A51)' ) header
END DO
C Wenn Du nicht mit i=1 anfängst, wirst Du zu wenig Daten einlesen.
C Insgesamt ist das ein mutiges Unterfangen. Ich würde bis EOF einlesen.
C Dann kannst Du bei i nachschauen, wie viele Datensaätze es geworden
C sind.
DO i = 1, M
READ(10,'(A6,X,A5,2X,A8,2X,A6,5X,A5,5X,A6,
+ 5X,A6,5X,A5,5X,A5,5X,A5,2X,A4,2X,A5,X,A6,X,A5)')
+ stn, wban, date, temp, dewp, slp,
+ stp(i),visib(i),wdsp(i),mxspd(i),gust(i),maxi(i)
+ mini(i),prcp(i),sndp(i),frshtt(i)
C Hier hast Du noch einiges zu tun. Ich habe mit dem Aufräumen
C angefangen. Hinter maix fehlt noch ein Komma. Das Format zum Lesen ist
C nicht in Ordnung. Du liest nun die Werte als Text (A-Format) ein. Das
C kannst Du so ohne weiters machen, weil Du nicht mit den Werten rechnen
C willst. Du muss nut die Variablen auch als Character deklarieren.
C Ich würde bei Character bleiben.
C Im anderen Fall musst Du das gleiche Format auch in die Write-
C Anweisung schreiben.
C Mein Vorschlag: Führe drei Character-Variablen ein:
C beforestation(..), station(..), afterstation(..)
C Die Längen bestimmst Du bitte selber. Dann komst Du mit
C READ(10, '(A.., A.., A..)' )
C + beforestation, station, afterstation
C aus.
C Ich würde sowiso immer die ganze Zeile in eine Character-Variable
C mit zum Beispiel dem Namen Dataline einelsen.dann mit
C READ( Dataline, Format, err= ) alle weiteren Variablen aus diese Zeile
C auslesen und anschließend noch überprüfen, ob sie sinnvolle Werte
C haben.
C Nun kannst Du auf die Stationen verteilen:
C Wenn Dein Compiler nicht Fortran 90 kann, dann musst Du anstelle von ==
C .EQ. schreiben
if ( station == "042720" )
WRITE( 11, '(A.., A.., A..)' )
+ beforestation, station, afterstation
elsif ( station == "072010" )
WRITE( 12, '(A.., A.., A..)' )
+ beforestation, station, afterstation
C und so weiter.... bis
else
WRITE( *,* ) "Diese Station ist nicht vorgesehen"
WRITE( *,* ) station
ENDDO
C Nur so aus Spaß, wenn Du mehrere Dateien hast, dann kannst Du sie auch
C so schließen
DO I = 0, 6
CLOSE(I)
END DO
C
C Ich finde es immer hilfreich, noch eine kurze Mitteilung zu bekommen.
WRITE( *,* ) "Seperate_Stations completed"
So weit erst einmal. Ich habe nicht vor bei mir einen Fortran-Compiler zu installieren. Daher schreibe ich nur as meiner Erfahrnung von vor 20 Jahren.
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 16:36 Mi 31.03.2010 | Autor: | Tyskie84 |
Hallo,
vielen Dank für deine sehr ausführlichen Erläuterungen. Ich werde mich heute dran setzen und versuchen alles umzusetzen.
Gruß
|
|
|
|