主题:[讨论]请教文件读取问题:如何用read语句跳行直接读取?
andyfem [专家分:0] 发布于 2008-05-05 16:43:00
对于数据量大的文件,例如只要读取100001行以后的数据,100001行以前的数据需要跳过,我目前的做法是:
do i=1,100000
read(100,*) !100为数据文件
enddo
对于批量处理,这种方法读取速度较慢。
如果能用read语句跳行,直接从100001行开始读数,那应该快许多。请问各位高手,这种想法能实现吗?
十分感谢!
最后更新于:2008-05-05 17:08:00
回复列表 (共16个回复)
沙发
korina [专家分:50] 发布于 2008-05-06 11:04:00
open(unit,finlename,access="direct")
read(unit,format,rec=100001)
板凳
andyfem [专家分:0] 发布于 2008-05-06 12:30:00
十分感谢1楼的兄弟!
您推荐的方法还没琢磨成功。
迫切希望您再次出手,针对以下例子给予改写。该例子中,数据文件stress.dat有500万行,只需要读取100000后的25000行数据
open(100,file="D:\stress.dat",status="old")
do j=1,100000 !跳过前面100000行
read (100,*)
enddo
do j=1,25000
read (100,600) k,disp_part(j,1),disp_part(j,2),disp_part(j,3)
enddo !j
close(100)
600 format(i6,e22.6,e18.6,e18.6)
3 楼
korina [专家分:50] 发布于 2008-05-06 21:30:00
open(100,file="D:\stress.dat",action="read",access="direct",form="formatted",recl=66,status="old")
do j=100001,125000
read (100,600,rec=j) k,disp_part(j,1),disp_part(j,2),disp_part(j,3)
enddo
close(100)
600 format(i6,e22.6,e18.6,e18.6)
4 楼
andyfem [专家分:0] 发布于 2008-05-07 10:58:00
[quote]open(100,file="D:\stress.dat",action="read",access="direct",form="formatted",recl=66,status="old")
do j=100001,125000
read (100,600,rec=j) k,disp_part(j,1),disp_part(j,2),disp_part(j,3)
enddo
close(100)
600 format(i6,e22.6,e18.6,e18.6)
[/quote]
十分感谢korina 兄!
本想给此帖评30分,可是系统提示“同一主题评分不能超过50分”,所以只能20分啦。
还得请您出手:按照您提供的方法改写程序,运行之后出现以下错误提示:
“forrtl: severe (64): input conversion error, unit 100, file D:\stress.dat”
5 楼
korina [专家分:50] 发布于 2008-05-07 11:19:00
剩下的工作我就不知道了 看看你的数据文件读取的格式跟你的原文件格式是不是一致的 此外 我不是兄弟
6 楼
accordion [专家分:830] 发布于 2008-05-08 09:01:00
你试试把格式说明去掉!
open(100,file="D:\stress.dat",action="read",access="direct",recl=66,status="old")
do j=100001,125000
read (100,rec=j) k,disp_part(j,1),disp_part(j,2),disp_part(j,3)
enddo
close(100)
7 楼
andyfem [专家分:0] 发布于 2008-05-08 15:09:00
[quote]你试试把格式说明去掉!
open(100,file="D:\stress.dat",action="read",access="direct",recl=66,status="old")
do j=100001,125000
read (100,rec=j) k,disp_part(j,1),disp_part(j,2),disp_part(j,3)
enddo
close(100)
[/quote]
十分感谢楼上兄弟!
我也试过这种方法,去掉form="formatted" 之后出现以下错误:
forrtl: severe (257): formatted I/O to unit open for unformatted transfers, unit 100
8 楼
liangrong [专家分:2090] 发布于 2008-05-08 22:23:00
3F korina 的程序是可行的
因為是有format的讀取方式
所以如 korina 所說
需要比對文件格式與程序中讀取的格式是否一致
如果能列出一個數據
也許較方便瞭解問題所在
9 楼
andyfem [专家分:0] 发布于 2008-05-09 09:32:00
谢谢liangrong老师!
部分数据如下,请各位老师继续不吝赐教。另外,我用的编译器是CVF6.6,不知是否与编译器有关。
11851 -.140551E-01 -.622954E-01 -.446735E-01
11852 -.140128E-01 -.623127E-01 -.446332E-01
11853 -.139680E-01 -.623208E-01 -.446324E-01
11854 -.139673E-01 -.623137E-01 -.446762E-01
11855 -.140148E-01 -.623086E-01 -.446766E-01
11856 -.140567E-01 -.622955E-01 -.446590E-01
11857 -.140584E-01 -.622954E-01 -.446325E-01
11858 -.140617E-01 -.623163E-01 -.446947E-01
11859 -.140492E-01 -.623290E-01 -.446912E-01
11860 -.140615E-01 -.623161E-01 -.446858E-01
10 楼
liangrong [专家分:2090] 发布于 2008-05-09 12:29:00
我用gfortran編譯
你的數據可以讀寫無誤
不確定是不是編譯器的關係
但以前曾有遇過編譯器自家對recl的聲明相異的情形
編譯器的文件或許有說明
我来回复