Fortran Coder

标题: 读取文件中的特定值 [打印本页]

作者: huiselilun    时间: 2015-4-14 17:10
标题: 读取文件中的特定值
我要读取的数据文件是这个样子的
  No    Well    Type    Description               Oil Rate   Water Rate   Gas Rate     FBHP
                                                 (m3 /day)   (m3 /day)   (m3 /day)     (kPa)
  ---------------------------------------------------------------------------------------------
  No    Well    Type    Description               Oil Rate   Water Rate   Gas Rate     FBHP
                                                 (m3 /day)   (m3 /day)   (m3 /day)     (kPa)
  ---------------------------------------------------------------------------------------------
  No    Well    Type    Description               Oil Rate   Water Rate   Gas Rate     FBHP
                                                 (m3 /day)   (m3 /day)   (m3 /day)     (kPa)
  ---------------------------------------------------------------------------------------------
  No    Well    Type    Description               Oil Rate   Water Rate   Gas Rate     FBHP
                                                 (m3 /day)   (m3 /day)   (m3 /day)     (kPa)
  ---------------------------------------------------------------------------------------------
Time           =      32.00000 days              
   1 P1           6 Liquid Production Rate  Srf    14.81       15.19       0.000       0.000       1.026       50.63      1.1939E+04
Time           =      32.00000 days              
   2 P2           6 Liquid Production Rate  Srf    14.90       15.10       0.000       0.000       1.013       50.32      1.1984E+04
Time           =      32.00000 days              
   3 P3           6 Liquid Production Rate  Srf    14.86       15.14       0.000       0.000       1.019       50.47      1.1902E+04
Time           =      32.00000 days              
   4 P4           6 Liquid Production Rate  Srf    14.96       15.04       0.000       0.000       1.005       50.13      1.1943E+04
Time           =      32.00000 days              
   5 P5           6 Liquid Production Rate  Srf    14.65       15.35       0.000       0.000       1.048       51.18      1.2031E+04
  No    Well    Type    Description               Oil Rate   Water Rate   Gas Rate     FBHP
                                                 (m3 /day)   (m3 /day)   (m3 /day)     (kPa)
  ---------------------------------------------------------------------------------------------
后面都是重复这样的格式,不同的是下面这段
No Well Type Description Oil Rate Water Rate Gas Rate FBHP
(m3 /day) (m3 /day) (m3 /day) (kPa)
---------------------------------------------------------------------------------------------
出现的次数不确定.
需要读取的数据是下面这段
Time = 32.00000 days
1 P1 6 Liquid Production Rate Srf 14.81 15.19 0.000 0.000 1.026 50.63 1.1939E+04
中的Time后的取值,以及第二行的P1字符串和Srf后面的实数.

我的思路是首先检查某行的开头字符是否是Time,如果不是跳过这行检查下一行.如果是,则进行本行和下一行的读取操作.
我的问题是读取文件时的读取位置怎么控制,这个检查操作改怎么写?
谢谢大神!



作者: fcode    时间: 2015-4-14 17:16
Open 打开文件
循环 Read ,每次 read 读一行,如果不满足条件就继续下一次循环。
Backspace 回退一行。
Rewind 直接回退到起始位置。

顺序有格式文件,大概就这些控制方法。

你的思路非常正确。按照这个思路去做就可以了。


good luck!

作者: huiselilun    时间: 2015-4-15 10:26
fcode 发表于 2015-4-14 17:16
Open 打开文件
循环 Read ,每次 read 读一行,如果不满足条件就继续下一次循环。
Backspace 回退一行。

我还有一个问题想问,在读的时候,Srf后面的值可能是小数表示,也可能是科学计数E表示,写读入格式的时候怎么样才能两种数据表现都能读入。
作者: huiselilun    时间: 2015-4-15 10:34
fcode 发表于 2015-4-14 17:16
Open 打开文件
循环 Read ,每次 read 读一行,如果不满足条件就继续下一次循环。
Backspace 回退一行。

是用G编辑符吗?
作者: 楚香饭    时间: 2015-4-15 15:02
找到 Srf 的位置,然后对后面的数据 read( str ,*)
作者: huiselilun    时间: 2015-4-15 17:24
我写了循环来读取数据,但是总是读取出错,error值大于0,进入死循环,求帮忙看下,辛苦大神。
[Fortran] 纯文本查看 复制代码
PROGRAM READPLOT
        IMPLICIT NONE
        INTEGER :: ERROR
        CHARACTER(4) :: CTIME   ! 检查是否为Time
        DOUBLE PRECISION :: DTIME   ! 临时存储Time后的值
        INTEGER, PARAMETER  :: MAXTN = 1000, MAXWN = 20 ! 最大存储1000个时间步,20口井的数据
        DOUBLE PRECISION :: D(MAXTN)    ! 存储Time后的所有值
        CHARACTER(10) :: WELLNAME(MAXWN),WELL   ! 存储井名,最大十个字符
        INTEGER :: IT,IWELL ! 时间步数,井数
        DOUBLE PRECISION :: OILRATE(MAXWN,MAXTN),WATERRATE(MAXWN,MAXTN) ! 油水产量
        DOUBLE PRECISION :: GASRATE(MAXWN,MAXTN),GOR(MAXWN,MAXTN)   ! 气产量,气油比
        DOUBLE PRECISION :: WOR(MAXWN,MAXTN),WCUT(MAXWN,MAXTN),FBHP(MAXWN,MAXTN)    ! 油水比,含水率,井底压力
        DOUBLE PRECISION :: OR,WR,GR,G,WO,WC,FB ! 临时存储以上数据
        INTEGER :: MXWN,MXTN    ! 存入的最大数据个数
        INTEGER :: I,J  ! 循环变量
   
    ! 占位变量,不进行存储
    CHARACTER(4) :: AA
    INTEGER :: BB
    CHARACTER(27) :: CC
       
    ! 初始化
        IT = 1
        D = 0.0
        ERROR = 0
        WELLNAME = '         '
       
    ! 读取数据
        OPEN(UNIT = 415, FILE = 'plot.out')
        DO WHILE(ERROR >= 0)    ! 检查读取文件是否结束
                READ(415,IOSTAT = ERROR) CTIME,AA,DTIME,AA,BB,AA,BB
        IF(ERROR == 0) THEN ! 如果文件读取正常进行以下操作
                    IF(CTIME == 'Time') THEN
                            IF(IT == 1) THEN    ! 如果是第一个时间步数据
                                    D(IT) = DTIME
                                    READ(415,IOSTAT = ERROR) IWELL,WELL,BB,CC,OR,WR,GR,G,WO,WC,FB                       
                                    WELLNAME(IWELL) = WELL
                                    OILRATE(IWELL,IT) = OR
                                    WATERRATE(IWELL,IT) = WR
                                    GASRATE(IWELL,IT) = GR
                                    GOR(IWELL,IT) = G
                                    WOR(IWELL,IT) = WO
                                    WCUT(IWELL,IT) = WC
                                    FBHP(IWELL,IT) = FB
                            ELSE
                                    IF(D(IT) == DTIME) THEN ! 是否相同的时间步不同的井数据
                                            READ(415,IOSTAT = ERROR) IWELL,WELL,BB,CC,OR,WR,GR,G,WO,WC,FB               
                                            WELLNAME(IWELL) = WELL
                                            OILRATE(IWELL,IT) = OR
                                            WATERRATE(IWELL,IT) = WR
                                            GASRATE(IWELL,IT) = GR
                                            GOR(IWELL,IT) = G
                                            WOR(IWELL,IT) = WO
                                            WCUT(IWELL,IT) = WC
                                            FBHP(IWELL,IT) = FB
                                    ELSE    ! 下一个时间步第一口井数据
                                            IT = IT + 1
                                            D(IT) = DTIME
                                            READ(415,IOSTAT = ERROR) IWELL,WELL,BB,CC,OR,WR,GR,G,WO,WC,FB                       
                                            WELLNAME(IWELL) = WELL
                                            OILRATE(IWELL,IT) = OR
                                            WATERRATE(IWELL,IT) = WR
                                            GASRATE(IWELL,IT) = GR
                                            GOR(IWELL,IT) = G
                                            WOR(IWELL,IT) = WO
                                            WCUT(IWELL,IT) = WC
                                            FBHP(IWELL,IT) = FB
                                    END IF
                            END IF
            END IF
        END IF
        END DO
        CLOSE(415)       
       
    ! 输出数据
        OPEN(UNIT = 416, FILE = 'plot.dat')
                MXWN = 1
                MXTN = 1
                DO I = 1,MAXTN
                        IF (D(MXTN) == 0) THEN
                                EXIT
                        ELSE
                                MXTN = MXTN + 1
                        END IF
                END DO
                DO I = 1, MAXWN
                        IF (WELLNAME(I) == '         ') THEN
                                EXIT
                        ELSE
                                MXWN = MXWN + 1
                        END IF
                END DO
                       
                DO I = 1,MXWN
                        WRITE(416,1003) WELLNAME(I)
                        WRITE(416,1004)
                        DO J = 1, MXTN
                                WRITE(416,1005) D(J),OILRATE(I,J),WATERRATE(I,J),GASRATE(I,J), &
                &GOR(I,J),WOR(I,J),WCUT(I,J),FBHP(I,J)
                        END DO
                END DO
1003 FORMAT(A10)
1004 FORMAT('TIME',9X,'OILRATE',7X,'WATERRATE',5X,'GASRATE',7X,'GOR',11X, &
        & 'WOR',11X,'WCUT',10X,'FBHP')
1005 FORMAT(F10.5,3X,6(G11.4,3X),G11.4)                       
        CLOSE(416)
   
END PROGRAM

READPLOT.F90

3.18 KB, 下载次数: 2

plot.dat

225 Bytes, 下载次数: 2


作者: huiselilun    时间: 2015-4-15 17:27
fcode 发表于 2015-4-14 17:16
Open 打开文件
循环 Read ,每次 read 读一行,如果不满足条件就继续下一次循环。
Backspace 回退一行。

求大神帮忙看下我写的程序,多谢多谢
作者: 楚香饭    时间: 2015-4-15 19:26
我只修改一段代码,剩下的没动。

加了一个变量:
Character(Len=512) :: cStr !// 读取用

[Fortran] 纯文本查看 复制代码
  ! 读取数据
        OPEN(UNIT = 415, FILE = 'plot.out')
        Do !// 一直读
                READ(415 ,IOSTAT = ERROR) cStr !// 先读入字符串
    if ( Error /= 0 ) exit !// 如果读错,则退出循环(文件结束)
    read( cStr , * ) cTime
    if ( cTime == "Time" ) THEN
                  IF(IT == 1) THEN    ! 如果是第一个时间步数据
                          D(IT) = DTIME
                          READ(415,IOSTAT = ERROR) IWELL,WELL,BB,CC,OR,WR,GR,G,WO,WC,FB                       
                          WELLNAME(IWELL) = WELL
                          OILRATE(IWELL,IT) = OR
                          WATERRATE(IWELL,IT) = WR
                          GASRATE(IWELL,IT) = GR
                          GOR(IWELL,IT) = G
                          WOR(IWELL,IT) = WO
                          WCUT(IWELL,IT) = WC
                          FBHP(IWELL,IT) = FB
                  ELSE


我算出的结果也是:
         
TIME         OILRATE       WATERRATE     GASRATE       GOR           WOR           WCUT          FBHP
   0.00000     0.000         0.000         0.000         0.000         0.000         0.000         0.000   

作者: huiselilun    时间: 2015-4-16 15:11
楚香饭 发表于 2015-4-15 19:26
我只修改一段代码,剩下的没动。

加了一个变量:

我也是这个结果,说明没有读入数据,哪错了呢?
作者: fcode    时间: 2015-4-16 21:43
自己 debug 跟踪一下,看是哪些判断符合被跳过了
作者: huiselilun    时间: 2015-4-17 10:10
楚香饭 发表于 2015-4-15 19:26
我只修改一段代码,剩下的没动。

加了一个变量:

运行到这步的时候
[Fortran] 纯文本查看 复制代码
READ(415 ,IOSTAT = ERROR) cStr !// 先读入字符串

发现ERROR为31,读取有问题了。。。。。
作者: fcode    时间: 2015-4-17 12:33
读字符串有问题,一般就是文件结束了。通常没有其他问题。
作者: huiselilun    时间: 2015-4-17 19:42
fcode 发表于 2015-4-17 12:33
读字符串有问题,一般就是文件结束了。通常没有其他问题。

Fortran程序不知道该怎么改了。最后换C++搞定了,花了我一天时间。。。。
不过还是十分感谢群主。




欢迎光临 Fortran Coder (http://bbs.fcode.cn/) Powered by Discuz! X3.2