回 帖 发 新 帖 刷新版面

主题:缺测值的处理

fn后面到的是风速数据,有31*8行,前面31*4是2分钟数据,等号后面31*4行是10分钟数据,我需要读取10分钟的数据
fn
....................................
166033 146034 155031 134031 147043 132039.
127033 118033 110035 117034 107038 126025
125027 076014 125026 137028 148025 //////
////// ////// PPC000 ////// ////// //////
////// PPC012 ////// ////// ////// //////.
...............................
我想把数据中的//////和PPC???替换成999999,用下面的语句            
                   do j=1,n
                       if(b(j)=='//////'.or.b(j)==‘PPC???’) b(j)='999999'
                       read(b(j),"(i6)")a(i,j)
                   enddo
为什么结果是这样啊
166033 146034 155031 134031 147043 132039
127033 118033 110035 117034 107038 126025
125027 076014 125026 137028 148025 126025
125027 076014 125026 137028 148025 126025
125027 076014 125026 137028 148025 126025
....................................

回复列表 (共12个回复)

沙发


请给位大侠不吝赐教[em18]

板凳

你的整数a定义的是什么类型? 默认单精度整型正负3W多, 但它读取99W?

3 楼

我定义的是长整型的

4 楼

帖代码吧, 这样隔空猜效率低.

5 楼

if(b(j)=='//////'.or.b(j)==‘PPC???’) b(j)='999999'
改为:
if(B(j,1:3).EQ.'///'.or.b(j,1:3).EQ.'PPC')b(j)='999999'

6 楼

program main
     implicit none    
     character(len=100) ::ccc
     integer i,ii,j,m,n,dd
     integer,allocatable ::a(:,:)
     character(len=7),allocatable ::b(:)

     dd=31
     m=dd*4
     n=6
           
     allocate(a(m,n))
     allocate(b(n))

     open(1,file='A54401-201007.txt',status='old')
     open(2,file='201007.txt')
       do while(.not.eof(1))
        read(1,'(A100)')ccc
        if(ccc=='FN')then
           do i=1,m
             read(1,'(A100)')ccc
             if((index(ccc,'='))/=0)then
               do ii=1,m
                 read(1,'(A100)')ccc 
                 read(ccc,*)(b(j),j=1,n)
                   [b][color=800000]do j=1,n
                     if(b(j)=='//////'.or.b(j)=='PPC???') b(j)='-99999'
                     read(b(j),"(i6)")a(i,j)
                   enddo[/color][/b]                  
                   write(2,"(6i7)")a(i,:)
               enddo
              endif
           enddo
        endif
     enddo

    deallocate(a)
    deallocate(b)

    close(1)
    close(2)
    
    stop
    end program

7 楼

现在发现不是红字部分出现问题,而是它前面
               do ii=1,m
                 read(1,'(A100)')ccc 
                 read(ccc,*)(b(j),j=1,n)
这一部分有问题
当出现//////的时候,读取出现问题,只显示上一行这个位置的数据

各位有什么方法解决啊
[em10]

8 楼

将/////替换成NAN就可以读取出来,为甚么//////不可以啊

9 楼

integer(kind=4),allocatable ::a(:,:)
这样试试吧, 一般如果没有修改过编译参数默认是kind=2的.

read(ccc,*)(b(j),j=1,n)  这个你用默认格式去读取未必能正确吧, 最好还是加入A格式的控制. 其实你直接把ccc按照7个字节一段这样分开就是你要的b了阿. 例如b(1)=ccc(1:7); b(2)=ccc(9:16);... (当然实际上应按照规律写成循环)

想问问b(j)=='PPC???' 能把PPC012的判断出来?

10 楼

谢谢 yeg001
b(j)=='PPC???' 不能判断出PPC012
我现在已经改成
if(index(b(j),'PPC')/=0) b(j)='999999'

我来回复

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