请问Fortran专家,如何用Fortran读取文本中的某几列数据呀(数据量太大全部读入很费时间)

img


由于数据过大,Excel中打不开。大概是这样的数据,我不需要前面的15行,需要第7 8 9 11列
卑微求解~

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 你可以看下这个问题的回答https://ask.csdn.net/questions/7634634
  • 除此之外, 这篇博客: Fortran学习笔记一:编译环境、变量类型、流程控制、可分配数组、文件输入输出、函数、矩阵运算中的 5. 子程序和子函数 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:

    Fortran中函数分两类:子程序(subroutine)和自定义函数(function)。自定义函数本质上就是一般数学上的函数,一般要传递自变量给自定义函数,返回函数值。

    但!子程序Module不一定是这样,可以没有返值也可以多个返回值。一般用于封装程序模块,把具有相关功能的函数及变量封装在一起 。用法很单,但能提供很多方便,使程序变得简洁,比如使用全局变量不必每次都声明一长串。

    注意:1. function的函数名就是输出变量,也就是说,你想输出的东西必须赋值给函数名;function一般放在主函数内,直接放在主函数外面没法调用,除非提供一个接口,如函数在一个module内;

    2. subroutine的参数列表可能既包含输入也包含输出,例如(a1,a2,a3),a1和a2可能是输入,但a3为输出;也可能a1-a3都是输入;所以说要用intent(in/out/inout)表明参数的类型。

    请阅读下面的程序:

    module add
        contains
        function add5(a,b)
            double precision::a,b,add5
            add5=a+b
        end function add5
    end module add
    
    program FileWriteRead
        use add ! add是一个module,里面有函数add5
        implicit none
    
        double precision::a=1,b=2,c
        call add1(a,b) ! 只有输入没有输出
    
        call add2(a+1,b,c) ! a,b是输入,c是输出
        write(*,"(A5,E10.2)")"a+b=",c ! 输出结果到屏幕
    
        call add3(a,b) ! a,b是输入,b是输出
        write(*,"(A5,E10.2)")"b=",b
    
        c=add4(a,b) ! 注意这个时候的b已经变了
        write(*,"(A5,E10.2)")"a+b=",c
    
        write(*,"(A5,E10.2)")"a+b=",add5(a,b) ! 用add子程序中的函数add5
    
        contains
        function add4(a,b) ! 主程序内部定义函数
            double precision::a,b,add4
            add4=a+b
        end function add4
    end program
    
    subroutine add1(a,b) ! 子函数1
        implicit none
        doubleprecision,intent(in)::a,b ! intent是对输入参数列表(a,b)进行输入/输出的指定
        doubleprecision :: c
        c=a+b
        write(*,"(A5,E10.2)")"a+b=",c ! 输出结果到屏幕,A5是输出五个字符,E10.2表示科学计数法输出10个字符,小数部分2个字符
    end subroutine add1
    
    subroutine add2(a,b,c) ! 子函数2
        implicit none
        double precision,intent(in)::a,b
        double precision,intent(out):: c
        c=a+b
    end subroutine add2
    
    subroutine add3(a,b) ! 子函数3
        implicit none
        double precision,intent(in)::a
        double precision,intent(inout):: b
        b=a+b
    end subroutine add3
    

     

     

  • 以下回答来自chatgpt:

    我可以给出使用Fortran读取文本文件中特定列数据的解决方案。首先,我们需要使用Fortran中的open语句打开要读取的文件,并使用read语句逐行读取数据。然后,我们需要使用split字符串函数将每行数据按照空格等分割符分割为数组,并选取特定的列数据。最后,我们需要使用write语句将选取的数据写入输出文件。具体的实现步骤如下:

    1.定义变量和数组 我们需要定义文件名、要读取的文件、要写入的文件以及要读取的数据列号等变量,并定义一个动态可分配数组来存储每行数据的不同列数据。代码示例如下:

    character(len=20) :: filename_in, filename_out
    integer :: unit_in, unit_out, i, j, col_num
    real, allocatable :: data(:,:)
    

    2.打开文件并读取数据 我们需要使用open语句打开要读取的文件,使用read语句逐行读取数据,并使用split函数分割数据。代码示例如下:

    open(unit=unit_in, file=filename_in, status='old')
    do i=1,15
        read(unit_in,*)   !跳过15行非数据行
    end do
    
    do i=1, 数据总行数
        read(unit_in,*) (data(i,j), j=1, 列数)
    end do
    
    close(unit=unit_in)
    

    3.选取特定列数据并写入输出文件 我们需要使用split函数将每行数据分割为数组,并选取特定的列数据,将结果写入输出文件中。代码示例如下:

    open(unit=unit_out, file=filename_out, status='replace')
    do i=1, 数据总行数
        call split(数据行数据字符串, 分割符, split_str)   !使用split函数分割数据行
        write(unit_out,*) data(i,选取的列1), data(i,选取的列2), data(i,选取的列3), data(i,选取的列4)   !将选取的列数据写入输出文件中
    end do
    close(unit=unit_out)
    

    4.完整代码 完整的代码示例如下:

    program read_file
        implicit none
    
        character(len=20) :: filename_in, filename_out
        integer :: unit_in, unit_out, i, j, col_num
        real, allocatable :: data(:,:)
    
        !设置要读取的文件名和要写入的文件名
        filename_in = 'input.txt'
        filename_out = 'output.txt'
        !设置要读取的列号
        col_num = 4
    
        !打开文件并读取数据
        open(unit=unit_in, file=filename_in, status='old')
        do i=1,15
            read(unit_in,*)   !跳过15行非数据行
        end do
    
        !读取数据行并分割数据
        allocate(data(数据总行数,col_num))
        do i=1, 数据总行数
            read(unit_in,*) (data(i,j), j=1, col_num)
        end do
        close(unit=unit_in)
    
        !选取特定列数据并写入输出文件
        open(unit=unit_out, file=filename_out, status='replace')
        do i=1, 数据总行数
            write(unit_out,*) data(i,选取的列1), data(i,选取的列2), data(i,选取的列3), data(i,选取的列4)   !将选取的列数据写入输出文件中
        end do
        close(unit=unit_out)
    
    end program read_file
    

    请注意,由于缺少具体的数据细节,代码示例可能不完整或需要进行一些修改,但是以上提供的框架和思路应该可以帮助您完成该任务。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^

你必须全部读取前n列,但可以只保存第n列

real temp(11),b,dat1(100),dat2(100)

do i=1, 15
read(10,*) !跳过前15end do

do i=1, 100
read(10,*) temp !读取前11dat1(i)=temp(7) !提取第7dat2(i)=temp(9) !提取第9end do