爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

搜索
查看: 816|回复: 0

[源代码] fortran多层次文件夹嵌套数据 【批处理】【文件】【多层文件夹】【系统命令】grads

[复制链接]

新浪微博达人勋

发表于 2024-4-3 16:59:15 | 显示全部楼层 |阅读模式

登录后查看更多精彩内容~

您需要 登录 才可以下载或查看,没有帐号?立即注册 新浪微博登陆

x

复制代码
在处理数据时经常会碰到文件夹嵌套文件夹的情况,如一个大文件夹包含a个高度文件夹,每个高度文件夹包含b个变量文件夹,每个变量文件夹包含c个日期文件,而日期文件中才包含真正的数据,共计a*b*c个文件,要对这些文件读取写出完整的命令太麻烦,所以调用系统命令读取文件夹名称和文件名。故分享实例代码如下,本代码读取嵌套文件数据并转换成grd格式,无法涵盖所有情况,仅供参考:
  1. program read_files
  2.       USE DFLIB
  3.   implicit none
  4.   character*100 folder_path,output,ii, file_name
  5.   character*20 varstr,hstr(4),tstr
  6.   integer varnum,hnum(4),tnum,maxhnum,locmax(1)
  7.   integer vari,hi,ti
  8.   integer i,numfiles,filenum,ios
  9.   logical(4) res
  10.   
  11.   open(100,file='D:\grads\dataofzhenduan.grd',form='binary')
  12.   output='none.txt'
  13.   call outnone(output)!!
  14.   
  15.   folder_path = 'D:\grads\zhenduanshuju\data'
  16.   i=1
  17.   write(ii,'(i2)'),i
  18.   output='dir'//trim(adjustl(ii))//'.txt'
  19.   call ListFile(folder_path,outPut)
  20.   varnum=numfiles(output)
  21.   open(31,file=''//trim(output)//'')
  22.   
  23.   do i=1,varnum
  24.       read(31,*),varstr
  25.       folder_path = 'D:\grads\zhenduanshuju\data\'//trim(varstr)
  26.       write(ii,'(i2)'),10+i
  27.       output='dir'//trim(adjustl(ii))//'.txt'
  28.       call ListFile_n(folder_path,outPut)
  29.       hnum(i)=numfiles(output)
  30.       open(i,file=''//trim(output)//'')
  31.   enddo
  32.   
  33.   rewind(31)
  34.   maxhnum=maxval(hnum)
  35.   locmax=maxloc(hnum)
  36.   i=locmax(1)!!
  37.   close(i)!!
  38.   !print*, locmax
  39.   write(ii,'(i2)'),10+locmax
  40.   output='dir'//trim(adjustl(ii))//'.txt'
  41.   open(32,file=''//trim(output)//'')
  42.   
  43.       
  44.   
  45.   folder_path = 'D:\grads\zhenduanshuju\data\air\100'
  46.   i=3
  47.   write(ii,'(i2)'),i
  48.   output='dir'//trim(adjustl(ii))//'.txt'
  49.   call ListFile(folder_path,outPut)
  50.   tnum=numfiles(output)
  51.   open(33,file=''//trim(output)//'')
  52.   !print*,varnum,hnum,tnum,maxhnum
  53.   
  54.   do ti=1,tnum
  55.       read(33,*),tstr
  56.       !print*,tstr
  57.       do vari=1,varnum-1
  58.           read(31,*),varstr
  59.           do hi=1,maxhnum
  60.               read(32,*),hstr(4)!!
  61.               read(vari,*,iostat=ios),hstr(vari)
  62.               if(hstr(4)/=hstr(vari).OR.ios /= 0)then
  63.                   BACKSPACE(vari)
  64.               endif
  65.               if(hstr(4)/=hstr(vari))then
  66.                   file_name='none.txt'
  67.                   call writefile(file_name)
  68.                   print*,file_name
  69.                   cycle
  70.               endif
  71.               file_name='D:\grads\zhenduanshuju\data\'//trim(varstr)//'\'//trim(hstr(4))//'\'//trim(tstr)
  72.               call writefile(file_name)
  73.               print*,file_name
  74.           enddo
  75.           rewind(32)
  76.       enddo
  77.       file_name='uv'
  78.       call writefileuv(file_name,tstr)
  79.       rewind(31)
  80.       rewind(1)
  81.       rewind(2)
  82.       rewind(3)
  83.   enddo
  84.   do i=1,varnum
  85.       close(i)
  86.   enddo
  87.   close(31)
  88.   close(32)
  89.   close(33)
  90.   close(100)
  91.   pause
  92.     end program read_files

  93.     subroutine ListFile(fPath,outPut)
  94.     character*(*),InTent(In):: fPath,outPut
  95.     character*100 CMD
  96.     LOGICAL(4) res
  97.     CMD="dir /on/b "//trim(fPath)//" >"//trim(outPut)
  98.     res=SYSTEMQQ(CMD)
  99.     end subroutine
  100.    
  101.     subroutine ListFile_n(fPath,outPut)
  102.     character*(*),InTent(In):: fPath,outPut
  103.     character*100 CMD
  104.     LOGICAL(4) res
  105.     CMD="dir /o-n/b "//trim(fPath)//" >"//trim(outPut)
  106.     res=SYSTEMQQ(CMD)
  107.     end subroutine
  108.    
  109.     ! Get the number of files in the folder
  110.     function numfiles(folder)
  111.     integer numfiles,status
  112.     character*100 folder
  113.     numfiles=0
  114.     open(unit=10, file=''//trim(folder)//'', status='old')
  115.     do i = 1, 1000
  116.     read(10, '(A)', iostat=status) file_name
  117.     if (status /= 0) exit
  118.     numfiles = numfiles + 1
  119.     end do
  120.     close(10)
  121.     end function
  122.    
  123.     subroutine writefile(filename)
  124.     real filedata(71,101)
  125.     integer::i=1,aa
  126.     character*100 filename
  127.     open(90,file=''//trim(filename)//'')
  128.     !if(aa==4)then
  129.      !   read(90,*)
  130.       !  read(90,*)
  131.        ! read(90,*)
  132.         !do i=1,71
  133.          !   read(90,*),(filedata(i,j),j=1,101)
  134.           !  write(100),(filedata(i,j),j=1,101)
  135.         !enddo
  136.         !i=1
  137.         !do i=1,71
  138.         !    read(90,*),(filedata(i,j),j=1,101)
  139.         !    write(100),(filedata(i,j),j=1,101)
  140.         !enddo
  141.     !else
  142.         read(90,*)
  143.         read(90,*)
  144.         read(90,*)
  145.         read(90,*)
  146.         do i=1,71
  147.             read(90,*),(filedata(i,j),j=1,101)
  148.             write(100),(filedata(i,j),j=1,101)
  149.         enddo
  150.     !endif
  151.     close(90)
  152.     end
  153.    
  154.     subroutine outnone(outPut)
  155.     real::none(71,101)=9999.990
  156.     integer i
  157.     character*100 output
  158.     open(unit=11, file=''//trim(output)//'')
  159.     write(11,*),9999.990
  160.     write(11,*),9999.990
  161.     write(11,*),9999.990
  162.     write(11,*),9999.990
  163.     do i=1,71
  164.     write(11,*),(none(i,j),j=1,101)
  165.     enddo
  166.     close(11)
  167.     end subroutine
  168.    
  169.     subroutine writefileuv(varstr,tstr)
  170.     real filedata(142,101,12)
  171.     integer::i,j,k
  172.     character*100 varstr,filefile
  173.     character*20 tstr,hstr
  174.     do k=1,12
  175.         read(32,*),hstr
  176.         filefile='D:\grads\zhenduanshuju\data\'//trim(varstr)//'\'//trim(hstr)//'\'//trim(tstr)
  177.         open(90,file=''//trim(filefile)//'')
  178.         read(90,*)
  179.         read(90,*)
  180.         read(90,*)
  181.         do i=1,142
  182.             read(90,*),(filedata(i,j,k),j=1,101)
  183.         enddo
  184.     enddo
  185.     rewind(32)
  186.     do k=1,12
  187.         do i=1,71
  188.             write(100),(filedata(i,j,k),j=1,101)
  189.         enddo
  190.         print*,k
  191.     enddo
  192.     do k=1,12
  193.         do i=72,142
  194.             write(100),(filedata(i,j,k),j=1,101)
  195.         enddo
  196.         print*,k
  197.     enddo
  198.     close(90)
  199.     end subroutine
复制代码
以下有逐行注释的代码,本代码泛用性不强,其实可以通过宏定义提高泛用性,等以后有时间了再来修改吧,如果想要了解思路,可以下载代码文件
Source1.f90 (7.15 KB, 下载次数: 0, 售价: 1 贡献)
密码修改失败请联系微信:mofangbao
您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

本版积分规则

Copyright ©2011-2014 bbs.06climate.com All Rights Reserved.  Powered by Discuz! (京ICP-10201084)

本站信息均由会员发表,不代表气象家园立场,禁止在本站发表与国家法律相抵触言论

快速回复 返回顶部 返回列表