主题:[讨论]关于fortran读取各行长度不一格式不一具体行数不知数据文件的思考
iwanfly网友曾在一段时间前发过贴探讨过这个问题
http://bbs.pfan.cn/post-312402.html
当时思路不是很清晰
现思考结果如下,虽然比较麻烦,但最终还是解决了读取数据的问题,前提是知道每行最大的数据个数,比如7个。
不知道论坛上的网友是否有更好的方法,不吝赐教。
测试数据如下:
12 89 77
12 999 878 777
398 789 765 98 765
78 89
12 89 77
12 999 878 777
398 789 765 98 765
。。。。
总共78144行。大概需要5,6秒时间把数据全部读进。
program main
implicit none
integer,allocatable :: int_array(:,:),temp_array(:,:)
integer :: count,length,step,i,ierr
character*256 :: str_one_record
open(100,file='data.txt')
count=0
step=100000
length=step
allocate(int_array(length,7))
int_array=0
do while(.not. eof(100))
count=count+1
loop1: do i=7,1,-1
read(100,'(A)',advance='no',eor=168) str_one_record
168 read(str_one_record,*,end=999) int_array(count,1:i)
exit loop1
999 backspace 100
int_array(count,1:i)=0
end do loop1
if(mod(count,step)==0) then
allocate(temp_array(length,7))
temp_array=0
temp_array=int_array
deallocate(int_array)
length=length+step
allocate(int_array(length,7))
int_array=0
int_array(1:length-step,:)=temp_array
deallocate(temp_array)
end if
end do
allocate(temp_array(length,7))
temp_array=0
temp_array=int_array
deallocate(int_array)
allocate(int_array(count,7))
int_array=0
int_array(1:count,:)=temp_array(1:count,:)
deallocate(temp_array)
!下面处理int_array中数据
deallocate(int_array)
close(100)
pause
end program main
http://bbs.pfan.cn/post-312402.html
当时思路不是很清晰
现思考结果如下,虽然比较麻烦,但最终还是解决了读取数据的问题,前提是知道每行最大的数据个数,比如7个。
不知道论坛上的网友是否有更好的方法,不吝赐教。
测试数据如下:
12 89 77
12 999 878 777
398 789 765 98 765
78 89
12 89 77
12 999 878 777
398 789 765 98 765
。。。。
总共78144行。大概需要5,6秒时间把数据全部读进。
program main
implicit none
integer,allocatable :: int_array(:,:),temp_array(:,:)
integer :: count,length,step,i,ierr
character*256 :: str_one_record
open(100,file='data.txt')
count=0
step=100000
length=step
allocate(int_array(length,7))
int_array=0
do while(.not. eof(100))
count=count+1
loop1: do i=7,1,-1
read(100,'(A)',advance='no',eor=168) str_one_record
168 read(str_one_record,*,end=999) int_array(count,1:i)
exit loop1
999 backspace 100
int_array(count,1:i)=0
end do loop1
if(mod(count,step)==0) then
allocate(temp_array(length,7))
temp_array=0
temp_array=int_array
deallocate(int_array)
length=length+step
allocate(int_array(length,7))
int_array=0
int_array(1:length-step,:)=temp_array
deallocate(temp_array)
end if
end do
allocate(temp_array(length,7))
temp_array=0
temp_array=int_array
deallocate(int_array)
allocate(int_array(count,7))
int_array=0
int_array(1:count,:)=temp_array(1:count,:)
deallocate(temp_array)
!下面处理int_array中数据
deallocate(int_array)
close(100)
pause
end program main