- 积分
- 170
- 贡献
-
- 精华
- 在线时间
- 小时
- 注册时间
- 2013-9-27
- 最后登录
- 1970-1-1
|
登录后查看更多精彩内容~
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
下面为一fortran程序,由于本人久(xue)不(de)接(hen)触(lan),虽然程序可以运行,结果正确,但仍希望大家多多指点,个人认为有以下问题
(1)循环过多,运行了8个多小时,希望简化循环
(2)程序代码臃肿,不够简洁
(3)注释不够明确,个别概念表达不清
—————————————————代码区—————————————————————————————————————————
Module DFile_Mod !用来读取未知文件的行数
Implicit None
contains
Integer Function GetDataN( cStr )
Character( Len = * ) , Intent( IN ) :: cStr
Integer :: i
Logical :: bIsSeparator , bIsQuote
GetDataN = 0
bIsSeparator = .TRUE.
bIsQuote = .FALSE.
Do i = 1 , Len_Trim( cStr )
Select Case( cStr(i:i) )
Case( '"' , "'" ) !// 如果遇到引号
If ( .Not.bIsQuote ) GetDataN = GetDataN + 1 !//如果不在引号中,则增加一个数据
bIsQuote = .Not.bIsQuote !// 引号结束或开始
bIsSeparator = .FALSE.
Case( " " , "," , char(9) ) !// 如果遇到分隔符
If ( .Not.bIsQuote ) then !// 分隔符如果不在引号中
bIsSeparator = .TRUE.
End If
Case Default
If ( bIsSeparator ) then
GetDataN = GetDataN + 1
End If
bIsSeparator = .FALSE.
End Select
End Do
End Function GetDataN
Function f_numbervars(vars) result(numvars)
character(len=*), intent(in) :: vars
integer :: numvars
character(len=len(vars)) :: tmpvars
character(len=256) :: tmpvar
tmpvars = trim(adjustl(vars))
numvars = 0
do while (len_trim(tmpvars) > 0)
read(tmpvars, *) tmpvar
numvars = numvars + 1
tmpvars = tmpvars(index(tmpvars, trim(tmpvar))+len_trim(tmpvar):)
end do
End Function f_numbervars
Integer Function GetFileN( iFileUnit )
!// 此函数应在打开文件后立即调用。调用后读取位置返回文件起始位置
Implicit None
Integer , Intent( IN ) :: iFileUnit
character( Len = 1 ) :: cDummy
integer :: ierr
GetFileN = 0
Rewind( iFileUnit )
Do
Read( iFileUnit , * , ioStat = ierr ) cDummy
If( ierr /= 0 ) Exit
GetFileN = GetFileN + 1
End Do
Rewind( iFileUnit )
End Function GetFileN
End Module DFile_Mod
program main
!程序的作用:用于批量读取行数不确定的txt文件(共145个),第一列为站点数据,厡数据是按时间顺序排列的(站点乱序),希望将数据转换成按站点排列,将每一个站点的数据按时间顺序放入单独的txt文件中
use DFile_Mod
integer :: nRow ! nrow为行数
character*100 filename(145) ,files !filename(145) 145 是行数 files是路径加文件名
integer m ,k !m 定义为文件个数 k为站点数
REAL,ALLOCATABLE :: VEC(:,:),VECT(:,:),VECR(:,:)
INTEGER :: ISTATUS
INTEGER :: zhandian(756)
character(len=80)::filet,vs1
open(13,file='H:\climate data\zhandian.txt') !zhandian.txt用于存取站点数据
read(13,*) zhandian !读取站点数据
do k=1,756
write(vs1,*) zhandian(k)
filet=trim(adjustl(vs1))//".txt"
open(5,file=filet) !打开以站点命名的txt文档
open(10,file='H:\climate data\1.txt') !1.txt是文件名的列表,共145个文件
do m=1,145
read(10,*) filename(m)
files='H:\climate data\day\'//trim(adjustl(filename(m)))! 文件的路径加名字
Open( 12 , File = files ) !打开相应的txt文档
nRow = GetFileN( 12 ) !利用DFile_Mod计算每行的行数,每个文件有20列
ALLOCATE( VECT(20,nRow-1) , STAT = ISTATUS)
ALLOCATE( VEC(nRow-1,20) , STAT = ISTATUS) !用于分配动态数组
read(12,*)
read(12,*) VECt !不读取第一行数据描述的文字 从第二行开始读取数据 数据是按列读取 第一行变成了站点数
VEC=transpose(VECt) !转置之后第一列为站点数
do i=1,nRow-1
if (VEC(i,1)==zhandian(k) ) then
write( 5 , 100) VEC(i,:)
100 format(20f8.0)
endif
enddo !对站点数据进行筛选,将同一站点数据放入unit5中
enddo
close(12)
close(5)
close(10)
enddo
close(13)
end Program main
|
|