Fortran Coder

查看: 20553|回复: 12
打印 上一主题 下一主题

[文件读写] 读取文件中的特定值

[复制链接]

28

帖子

5

主题

0

精华

熟手

F 币
231 元
贡献
127 点
跳转到指定楼层
楼主
发表于 2015-4-14 17:10:41 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我要读取的数据文件是这个样子的
  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,如果不是跳过这行检查下一行.如果是,则进行本行和下一行的读取操作.
我的问题是读取文件时的读取位置怎么控制,这个检查操作改怎么写?
谢谢大神!


分享到:  微信微信
收藏收藏 点赞点赞 点踩点踩

2033

帖子

12

主题

5

精华

论坛跑堂

臭石头雪球

F 币
1641 元
贡献
709 点

美女勋章热心勋章星光勋章新人勋章贡献勋章管理勋章帅哥勋章爱心勋章规矩勋章元老勋章水王勋章

沙发
发表于 2015-4-14 17:16:40 | 只看该作者
Open 打开文件
循环 Read ,每次 read 读一行,如果不满足条件就继续下一次循环。
Backspace 回退一行。
Rewind 直接回退到起始位置。

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

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


good luck!

28

帖子

5

主题

0

精华

熟手

F 币
231 元
贡献
127 点
板凳
 楼主| 发表于 2015-4-15 10:26:50 | 只看该作者
fcode 发表于 2015-4-14 17:16
Open 打开文件
循环 Read ,每次 read 读一行,如果不满足条件就继续下一次循环。
Backspace 回退一行。

我还有一个问题想问,在读的时候,Srf后面的值可能是小数表示,也可能是科学计数E表示,写读入格式的时候怎么样才能两种数据表现都能读入。

28

帖子

5

主题

0

精华

熟手

F 币
231 元
贡献
127 点
地板
 楼主| 发表于 2015-4-15 10:34:55 | 只看该作者
fcode 发表于 2015-4-14 17:16
Open 打开文件
循环 Read ,每次 read 读一行,如果不满足条件就继续下一次循环。
Backspace 回退一行。

是用G编辑符吗?

737

帖子

4

主题

0

精华

大师

农村外出务工人员

F 币
704 元
贡献
361 点

新人勋章爱心勋章水王勋章元老勋章热心勋章

5#
发表于 2015-4-15 15:02:07 | 只看该作者
找到 Srf 的位置,然后对后面的数据 read( str ,*)

28

帖子

5

主题

0

精华

熟手

F 币
231 元
贡献
127 点
6#
 楼主| 发表于 2015-4-15 17:24:44 | 只看该作者
我写了循环来读取数据,但是总是读取出错,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

28

帖子

5

主题

0

精华

熟手

F 币
231 元
贡献
127 点
7#
 楼主| 发表于 2015-4-15 17:27:54 | 只看该作者
fcode 发表于 2015-4-14 17:16
Open 打开文件
循环 Read ,每次 read 读一行,如果不满足条件就继续下一次循环。
Backspace 回退一行。

求大神帮忙看下我写的程序,多谢多谢

737

帖子

4

主题

0

精华

大师

农村外出务工人员

F 币
704 元
贡献
361 点

新人勋章爱心勋章水王勋章元老勋章热心勋章

8#
发表于 2015-4-15 19:26:49 | 只看该作者
我只修改一段代码,剩下的没动。

加了一个变量:
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   

28

帖子

5

主题

0

精华

熟手

F 币
231 元
贡献
127 点
9#
 楼主| 发表于 2015-4-16 15:11:46 | 只看该作者
楚香饭 发表于 2015-4-15 19:26
我只修改一段代码,剩下的没动。

加了一个变量:

我也是这个结果,说明没有读入数据,哪错了呢?

2033

帖子

12

主题

5

精华

论坛跑堂

臭石头雪球

F 币
1641 元
贡献
709 点

美女勋章热心勋章星光勋章新人勋章贡献勋章管理勋章帅哥勋章爱心勋章规矩勋章元老勋章水王勋章

10#
发表于 2015-4-16 21:43:50 | 只看该作者
自己 debug 跟踪一下,看是哪些判断符合被跳过了
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

捐赠本站|Archiver|关于我们 About Us|小黑屋|Fcode ( 京ICP备18005632-2号 )

GMT+8, 2024-12-24 21:06

Powered by Tencent X3.4

© 2013-2024 Tencent

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