2016-08-16 3 views
0

Ich bin ziemlich neu in Fortran, also könnte dies eine naive Frage sein. Ich würde gerne eine riesige .TXT-Datei mit einer # von Zeilen = 540001 lesen. Die Daten stammen von einem Schallanemometer mit Messungen von Geschwindigkeit und Temperatur als u, v, w, T in fünf Höhen. Hier sind die ersten Zeilen der Datei:Wie kann ich Daten aus einer Textdatei lesen und Teile/Variablen in verschiedene Textdateien speichern/schreiben?

"2011-07-10 09:30:00",9838,1.132,2.30225,-0.5635,29.18585,0.30275,0.689,-0.01125,29.67004,0.2165,-0.25475,0.12725,29.8923,0.51425,3.0405,-0.58375,29.5242,-0.0085,3.6235,-0.65175,29.61972,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 
"2011-07-10 09:30:00.05",9839,-0.21325,3.22775,-0.17,29.10953,0.33925,0.6867501,-0.0015,29.67874,0.1715,-0.196,0.1235,29.8923,0.035,2.6915,-0.3845,29.82806,-0.102,3.5505,-0.15825,29.61795,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 
"2011-07-10 09:30:00.1",9840,0.403,3.1195,-0.37175,29.22574,0.06550001,0.6655,0.1275,29.76208,0.196,-0.2,0.1,29.901,0.16225,2.31525,-0.5975,29.69263,0.24175,3.11925,-0.3725,29.57977,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 

etc ...

Ich mag würde speichern/schreiben die Matrizen u (5,540001), v (5,540001), w (5,540001), und T (5,540001), damit ich einige Berechnungen und Diagramme machen kann. Hier ist, was ich verwende:

PROGRAM READ_MAIZE 
    IMPLICIT NONE 

    REAL,DIMENSION(:,:),Allocatable :: u_r, v_r, w_r, T_r 

    CHARACTER(len=*) :: fname 
    fname='FINALDATA.txt' 
    open(unit=1,file=fname,status='old',action='read') 

    do i=1,540001 
    READ(1,*)timestamp(i),count(i),u_r(5,i),v_r(5,i),w_r(5,i), & 
    T_r(5,i),u_r(2,i),v_r(2,i),w_r(2,i),T_r(2,i), & 
u_r(1,i),v_r(1,i),w_r(1,i),T_r(1,i), & 
    u_r(3,i),v_r(3,i),w_r(3,i),T_r(3,i), & 
u_r(4,i),v_r(4,i),w_r(4,i),T_r(4,i),flags(1:20) 
    end do 
    close(1) 

    WRITE(U_maize,'(A,I7.7,A,I7.7,A)'), & 
     '.txt' 
    open(11,file=U_maize,status='unknown',action='write') 
    write(11,'(F20.14)')(u_r) 
    end 

niemals den Auftrag in U_r dagegen (5, i), gefolgt von U_r (2, i) ... (sie entsprechen nur auf verschiedene Höhen, die nicht in Ordnung sind). Das funktioniert nicht.

+0

Willkommen bei StackOverflow. Bitte achten Sie darauf, Ihren Beitrag zu formatieren. Verwenden Sie geeignete Tags. Verwenden Sie immer tag [tag: fortran] und fügen Sie gegebenenfalls eine bestimmte Version hinzu. –

+0

* "Das funktioniert nicht" * sagt uns nichts Nützliches. Was geschieht? Irgendeine Fehlermeldung? Falsches Ergebnis? Wenn das Ergebnis falsch ist, wie sieht es aus? –

+0

Sie haben Fortran 77 angefordert, aber Ihr Code entspricht nicht Fortran 77. Ihre Verwendung von '&' folgt Free-Form-Quelle von Fortran 90 und neuer. –

Antwort

1

In Ihrem Code ist ziemlich viel los, was es schwer macht, zu verstehen, was Sie überhaupt vorhaben. Ich habe Ihren Code unten kommentiert und in etwas umgewandelt, das die Ausgabe kompiliert und produziert. Vielleicht wird es helfen.

PROGRAM READ_MAIZE 
    IMPLICIT NONE ! This means that every variable has to be declared 
        ! explicitly. You don't do that. So I did it for you 

    REAL,DIMENSION(:,:),Allocatable :: u_r, v_r, w_r, T_r 
    integer, dimension(:), allocatable :: data_count ! using fortran keywords 
      ! (such as "count") as variables is dangerous and should be avoided 
    character(len=len("2011-07-10 09:30:00.05")), allocatable :: timestamp(:) 

    CHARACTER(len=*), parameter :: fname='FINALDATA.txt' 
    character(len=len("U_XXXXXXX_XXXXXXX.txt")) :: U_maize 
    integer :: in_unit, out_unit ! Use integer variables for the unit. 
            ! together with newunit keyword, this is 
            ! safer 
    integer, parameter :: num_records = 3 ! you need to up this number to 
              ! 540001 again 
    integer :: i 

    ! If you have allocatable arrays, you need to allocate them before you 
    ! can use them 
    allocate(u_r(5, num_records)) 
    allocate(v_r(5, num_records)) 
    allocate(w_r(5, num_records)) 
    allocate(T_r(5, num_records)) 
    allocate(data_count(num_records)) 
    allocate(timestamp(num_records)) 

    ! the "newunit" keyword is a safe way to create a unique unit 
    ! identifier. You should really use this. 
    open(newunit=in_unit,file=fname,status='old',action='read') 

    do i=1,num_records 
     READ(in_unit,*) timestamp(i), data_count(i), & 
      u_r(5,i),v_r(5,i),w_r(5,i),T_r(5,i),  & 
      u_r(2,i),v_r(2,i),w_r(2,i),T_r(2,i),  & 
      u_r(1,i),v_r(1,i),w_r(1,i),T_r(1,i),  & 
      u_r(3,i),v_r(3,i),w_r(3,i),T_r(3,i),  & 
      u_r(4,i),v_r(4,i),w_r(4,i),T_r(4,i)  ! I left out the flags 
                ! since I didn't know what 
                ! that was. 
    end do 
    close(in_unit) 

    ! I don't know how the file name should be constructed, except 
    ! that it should end in a .txt, and the format. So I made something up. 
    write(U_maize, '(A, I7.7, A, I7.7, A)') 'U_', 35, '_', 6, '.txt' 

    open(newunit=out_unit,file=U_maize,status='unknown',action='write') 

    ! To make it more readable, I tell write to write 5 numbers per row, 
    ! Not sure whether this is what you want. 
    write(out_unit,'(5(X, F20.14))') u_r 
    close(out_unit) ! I know it isn't technically needed, but please always 
     ! close files when finished, even if the program terminates anyway. 
end program READ_MAIZE ! tell the compiler what you want to end here. 
+0

Vielen Dank. Das funktioniert – Khaled

Verwandte Themen