aliu 发表于 2009-12-2 09:53

请教风花雪月:如何读取多个文件的循环问题

风花雪月:
   你好!
   想请教你一个问题,就是在一个文件夹 file 中有很多文件名称有规律的数据文件,比如20001.dat ; 20002.dat, 20003.dat.............20010.dat 十个数据文件,每个数据文件中的数据组形式都是a(4,2880),现在想把所有数据中文件中的一个维数a(1,2880) 集中读取出来存到另一个文件00000.dat 中,,遇到的困难是,怎样实现这些数据文件名的循环,因为我实际遇到的数据文件有上千个,所以,没有办法在程序中写完一个一个数据文件的打开语句,,
您能告诉我怎样做到文件名的循环读取吗??
如果您有时间,用我上面的10个数据文件和对应的问题,写一个读取数据的示例程序,可以吗??
谢谢您的友好与帮助!
欢迎各位高手支招!
谢谢分享你们的知识!

lilili606 发表于 2009-12-2 18:47

character(20)::filename
filename="20001.dat"
do i=1,10
    write(filename(4:5),"(i2.2)")i
    open(20,file=filename)
!   do sth.....
    close(20)
end do
end

aliu 发表于 2009-12-4 11:28

楼上的兄弟
我根据你的示例程序写了下面的程序,是这样的:

program duru

dimensiona(4,2880), b(28800)
character(30) :: filename
integeri, j, m
open(10,file='e:\yuan-shuju\filename') !!原来数据的路径
open (20,file='e:\shuju\000.dat',statu='new') !! 要存储起来的新的数据文件
filename='00022007003vr.dat'   !!原第一个数据文件的名称(后面其他数据文件名变化的主要是9-11个数,即003的位置)
do i=003,010
    write(filename(9:11),"(i3)") i
   open (10,file='filename')
read(10,*)a
    do j=1,2880
       do m=1,28800
            b(m)=a(1,j)
       enddo
enddo
write(20,*)b(m)
close(10)
enddo
end

——————————————————————————
运行的错误提示是:
end -of -file during read ,unit10,file e:\yuan-shuju\filename


这个该怎样改呢??

lilili606 发表于 2009-12-4 12:53

看 我的注释
program duru

dimensiona(4,2880), b(28800)
character(30) :: filename
integeri, j, m
open(10,file='e:\yuan-shuju\filename') !!这句有问题,filename此时还没有赋值,打开时没有意义的,删掉就好了
open (20,file='e:\shuju\000.dat',status='new')
filename='00022007003vr.dat'
do i=003,010
    write(filename(9:11),"(i3.3)") i   !这里要改成I3.3表示前面把0补全
   open (10,file='filename')         !如果文件不在当前文件夹的话,在这里加上路径再加filename
read(10,*)a
    do j=1,2880
       do m=1,28800
            b(m)=a(1,j)
       enddo
enddo
write(20,*)b(m)
close(10)
enddo
end

aliu 发表于 2009-12-4 15:16

lilili606
我按照你的说法改了,不过还是出现同样的问题,end-of-file,
新的存储文件里面里面什么都没有,,,
我看了原数据文件,里面的数据都没有问题的,,郁闷,,,

aliu 发表于 2009-12-5 14:40

每次运行之后,总是在文件夹 yuan-shuju 里面产生一个filename 的数据文件(里面没有任何东西),也就是说,读取文件中, 程序的运行并没有能够把定义的文件和那些原来的数据文件匹配起来并进行打开和读数据,,
不知道是否还缺少某个语句,,老弄不明白,
看起来是小问题,还请请高手们支招,,,

lilili606 发表于 2009-12-5 21:36

open (10,file='filename')   不好意思喔   这句我没注意   应该改为
open (10,file=filename)

aliu 发表于 2009-12-6 13:03

谢谢 lilili606的热心为本问题做分析和解答,,
问题依旧在,还是建的filename文件名 没有能够去找到原来的数据文件,并打开读取,总会出现一个新的filename 文件,
我再好好想想,看怎么调才能调出来,,
仍然欢迎你的解答,对你在本问题上所花的时间和精力表示感谢,,

lilili606 发表于 2009-12-6 22:13

OK   反正最近没啥课呵呵

luanjab 发表于 2009-12-20 16:59

回复 8楼 aliu 的帖子

7楼正解。
如果按4楼注解,再加上路径的话好像应为:
open(10,file='e:\yuan-shuju\'//filename//'')
不一定对啊,哈哈。好久没用fortran了。

aliu 发表于 2009-12-29 10:17

谢谢 luanjab 的建议,,
导师突然让做另外的东西,结果把这个问题差点都忘记了,现在又回到这个问题来了,呵呵,还是在寻找答案中,,,

ChaChing 发表于 2009-12-29 11:04

end-of-file不是表示资料不足吗?

aliu 发表于 2009-12-29 20:44

回复 12楼 ChaChing 的帖子

这个我查找过了,所要读入的资料,也就是原数据文件的数据是没有问题,我觉得问题是所定义的路径没有能够找到原数据文件夹中的各个 .dat 文件,并进行匹配和打开读取数据,可惜,问题依旧存在,,,,还得从新调....

谢谢你的建议,,,

aliu 发表于 2010-1-1 16:27

搞定了,改用了另外的语言IDL 。之前用FORTRAN一直老出现问题,至今没有看到问题出在哪里,暂时放弃。我用的IDL 程序是这样的:
produru
j=4
t=2880
day=string(365)
dir='e:\yuan-shuju\'
outfile='e:\shuju\00.dat'
if(n_elements(outfile) eq 1)then begin
openw,outlun,outfile,/get_lun
endif else begin
outlun=-1
endelse
for k=1,365 do begin
    day=string(k,format='(i3.3)')
   filename='00022007'+day+'vr.dat'
openr,lun,dir+filename,/get_lun
a=fltarr(j,t)
readf,lun,a
free_lun,lun
for i=0,t-1 do begin
    aa=a(0,t-1)
printf,outlun,aa
endfor
endfor
free_lun,lun
end

aliu 发表于 2010-1-1 16:27

谢谢以上为我提过建议的朋友们,,
页: [1]
查看完整版本: 请教风花雪月:如何读取多个文件的循环问题