回 帖 发 新 帖 刷新版面

主题:求助:怎么用Fortran将开头相同的多行数据只输出为一行

一个如下形式的数据文件:
       66666           0          49           1           0           0
  1949011606           4         131        1351         996          35
  1949011612           4         132        1353         996          35
  1949011618           4         132        1356         996          35
       66666           0          37          27           0           0
       66666           0          39          28           0           0
       66666           0          42          29           0           0
       66666           0          38          30           0           0
  1953010100           6         134        1384         955          60
  1953010106           6         140        1374         955          60
  如您所见,以66666开头的有多行,我只需要输出一行,我自己编的程序虽然能实现只有一行66666,但却删除了非66666的第一行数据,我的程序如下:
      integer intensity,lat,lon,pres,wnd,line
      character yi*11,top*6     
      open(1,file='f:\data\typhoon\janold.txt')
      open(2,file='f:\data\typhoon\JAN.txt')
      read(1,10)yi,intensity,lat,lon,pres,wnd 
      write(2,*)yi,intensity,lat,lon,pres,wnd
      do while(.not.eof(1))
      read(1,10,end=100)yi,intensity,lat,lon,pres,wnd
10    format(a12,i12,i12,i12,i12,i12)
      top=yi(7:11)      
      if(top.eq.'66666')then    
      read(1,*)         
      else 
      read(1,10)yi,intensity,lat,lon,pres,wnd     
      write(2,*)yi,intensity,lat,lon,pres,wnd   
      endif
100   continue 
      backspace(1)
      enddo
    close(1)
    close(2)
      end
我的输出结果如下:
       66666           0          49           1           0           0
  1949011612           4         132        1353         996          35
  1949011618           4         132        1356         996          35
       66666           0          50           2           0           0
  1953010106           6         140        1374         955          60
要怎么做才能既删除多余的66666行有不会把需要的数据删掉呢?还请各位大侠不吝赐教!

回复列表 (共6个回复)

沙发

你的代码好乱啊...看不懂

重新写一个吧

Program Main
  Implicit None
  Character(Len=512) :: cStr
  Integer :: iRead = 0
  Logical :: bIsFirst = .true.
  Open( 12 , File = 'temp.txt' )
  Open( 13 , File ='out.txt' )
  Do
    Read( 12 , '(a512)' , end = 999 ) cStr
    Read( cStr , * ) iRead
    If( iRead == 66666 .and. ( .Not.bIsFirst ) ) then
      cycle
    Else If ( iRead == 66666 .and. ( bIsFirst ) ) then
      bIsFirst = .false.
      Write( 13 , '(a)' ) Trim( cStr )
    Else
      Write( 13 , '(a)' ) Trim( cStr )
    End If
  End Do
999  Close( 12 )
  Close( 13 )
End Program Main

板凳

非常感谢您的回复和指导!早前学过Fortran77,只为应付考试,没学好,真正要用了才知道要学的还很多,看了您的程序真是挺清楚,学习了!
还有,您的程序我运行了一下,结果只能输出第一行的66666,后面所有以66666开头的行都没有了,我是想保留一行,能不能劳烦您再给看看?多谢!多谢!

3 楼

非常感谢臭石头雪球的程序,我在andif前加了bIsFirst=.true.后就可以得到我想要的数据了!

4 楼

放弃f77吧, f77的能看懂就好.

5 楼

说的对!77太麻烦了,现在在努力学习f95,希望能有进步。论坛高手云集!每次来都有收获!感谢大家!

6 楼

不错不错,好好学习学习

我来回复

您尚未登录,请登录后再回复。点此登录或注册