简体   繁体   中英

Fortran read data with different length

I have a Fortran problem. I want to read in data with different length. they begin with:

 <TITLE>University of Wyoming - Radiosonde Data</TITLE>
 <LINK REL="StyleSheet" HREF="/resources/select.css" TYPE="text/css">
 <BODY BGCOLOR="white">
   <H2>08190  Barcelona Observations at 12Z 11 Feb 2015</H2>
 <PRE>
      -----------------------------------------------------------------------------
      PRES   HGHT   TEMP   DWPT   RELH   MIXR   DRCT   SKNT   THTA    THTE   THTV
      hPa     m      C      C      %    g/kg    deg   knot     K      K      K 
      -----------------------------------------------------------------------------
      1012.0     98   14.0   -1.0     36   3.53      0      0  286.2  296.5  286.8

from this point the file is for example 77 lines long. but others have only 55 , and the end is reached when this part comes

</PRE><H3>Station information and sounding indices</H3><PRE>
                         Station number: 8190

So I think I need a condition which runs out of the do loop? I get my data with :

wget 'http://weather.uwyo.edu/cgi-bin/sounding?region=europe& TYPE=TEXT%3ALIST&YEAR=2015&MONTH=02&FROM=1112&TO=1112&STNM=08190' -0 data.dat
open(33, file=infilename, form='formatted',&
access='sequential',action='read')

open(34, file=outfilename, form='formatted',&
access='sequential',action='write')


read(33,'(11/)')
do i=1,77
read(33, '(f7.1,2x,i5,2x,a5,2x,a5,4x,a3,3x,f4.2,4x,a3,4x,a3)')       pres,height,tmp,tmp_dew,rel_hum,mixing,wind_dir,wind_speed

write(34,'(f7.1,2x,i5,2x,a5,2x,a5,4x,a3,3x,f4.2,4x,a3,4x,a3)') pres,height,tmp,tmp_dew,rel_hum,mixing,wind_dir,wind_speed

end do 

close(33)
close(34)

I hope you can help me.

one approach is to read each line as a string, check for the end and process accordingly:

 character*1000 wholeline
 do while( .true. )
   read(33,'(a)')wholeline
   if ( index(wholeline,'</PRE>' ).ne.0 )exit
   read(wholeline,*)pres,height,tmp,tmp,dew ...
 enddo 

You can also perhaps more simply just read and exit on an error..

 do while( .true. )
   read(33,*,err=100)pres,height,tmp,tmp,dew ...
 enddo 
 100 continue

I'm not a fan of deliberately throwing errors if it can be avoided though.

As an aside you do not need that messy format, list directed will work fine for this example. In fact if all you are doing is transferring the data to another file, simply rewrite the string as: write(34,'(a)')trim(wholeline)

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM