Fortran 读取不同长度的数据
Fortran read data with different length
我有一个 Fortran 问题。我想读入不同长度的数据。
他们开始于:
<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
从这一点开始,文件的长度例如为 77 行。但是其他人只有55,到了这部分就结束了
</PRE><H3>Station information and sounding indices</H3><PRE>
Station number: 8190
所以我想我需要一个用完 do 循环的条件?
我通过以下方式获取数据:
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)
希望你能帮帮我。
一种方法是将每一行作为字符串读取,检查结尾并进行相应处理:
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
您也可以更简单地读取并在出现错误时退出..
do while( .true. )
read(33,*,err=100)pres,height,tmp,tmp,dew ...
enddo
100 continue
如果可以避免的话,我不喜欢故意抛出错误。
顺便说一句,您不需要那种凌乱的格式,定向列表对于这个例子来说效果很好。事实上,如果您所做的只是将数据传输到另一个文件,只需将字符串重写为:write(34,'(a)')trim(wholeline)
我有一个 Fortran 问题。我想读入不同长度的数据。 他们开始于:
<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
从这一点开始,文件的长度例如为 77 行。但是其他人只有55,到了这部分就结束了
</PRE><H3>Station information and sounding indices</H3><PRE>
Station number: 8190
所以我想我需要一个用完 do 循环的条件? 我通过以下方式获取数据:
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)
希望你能帮帮我。
一种方法是将每一行作为字符串读取,检查结尾并进行相应处理:
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
您也可以更简单地读取并在出现错误时退出..
do while( .true. )
read(33,*,err=100)pres,height,tmp,tmp,dew ...
enddo
100 continue
如果可以避免的话,我不喜欢故意抛出错误。
顺便说一句,您不需要那种凌乱的格式,定向列表对于这个例子来说效果很好。事实上,如果您所做的只是将数据传输到另一个文件,只需将字符串重写为:write(34,'(a)')trim(wholeline)