【问题标题】:Fortran: Add column per column to fileFortran:将每列添加到文件中
【发布时间】:2014-06-11 13:13:19
【问题描述】:

代码由一个 do-loop 组成,并在运行时创建数据数组。我需要将这些数组作为新列添加到文件中。

第一列是固定的(波长),第二列是在第一次运行中生成的:

OPEN (unit=11,file=filename // '.csv')  
WRITE(11,'(i4,A1,f10.6)') (lambda(ii),tab,resv(ii), ii=1,nw)
CLOSE(11)

lambda 是波长(4 位),tab 被声明为 char(9),resv 是我的数据(浮动)。该数组由nw=2000 项组成。

第一次运行脚本给了我一个很好的输出,我可以将它作为 .csv 加载到 MS Excel 中 但是,脚本是返回到循环的开头,计算新数据并将更改的“resv”项存储到新列中。

但是当我走的时候

WRITE(11,'(T17,i4,A1,f10.6)') (lambda(ii),tab,resv(ii), ii=1,nw)

新数据确实存储在第 17 列,但之前的所有数据都被删除了! 那么我怎样才能告诉 Fortran “添加”一个新列呢?

【问题讨论】:

  • 您不能从程序中编辑文件。用旧数据重命名文件,读取旧文件并用新旧数据写出新文件。完成后,删除旧文件。
  • 这似乎和stackoverflow.com/questions/24157423/…太相似了,请更新/完善原问题
  • 肯定是相似的,同样的代码有两个问题。最后一个问题的答案甚至是到达这里所必需的。但这不是最终的解决方案。这是我的实际问题。
  • @cup:同样的问题。当我读取旧数据时,我如何告诉 fortran 它应该为此使用两个新列?
  • 您根本无法写入现有文件中的新“列”。不适用于 fortran 或任何其他语言。您必须重写整个文件,或者使用占位符空白初始化文件并使用直接访问。见stackoverflow.com/questions/23834138/…

标签: fortran output multiple-columns fortran90


【解决方案1】:

试试这个的变种。查看 addcolumn 中的代码。限制是您的行不能超过 1024 个字符。您可以根据需要增加数组的大小。

  module mod_helper
     integer, parameter:: AMAX = 10
     integer, dimension(AMAX):: coldata
     integer:: revision
  contains
     subroutine init
        revision = 0
        do ii = 1, AMAX
           coldata(ii) = ii
        end do
     end subroutine init

     subroutine increment(howmuch)
        integer, intent(in):: howmuch
        coldata = coldata + howmuch
     end subroutine

     subroutine addcolumn(csvname)
        character*(*), intent(in) csvname
        integer(kind=2):: status
        integer:: prevlen
        character(1024):: prev, oldname, newname
        integer, parameter:: oldfile = 20, newfile = 30

        write(oldname, "(A,I3.3,'.csv')") csvname, revision
        revision = revision + 1
        write(newname, "(A,I3.3,'.csv')") csvname, revision
        if (revision .gt. 1) then
            ! Open the old file
            open(oldfile, file=oldname, access="sequential", status="old")
        end if
        open(newfile, file=newname, access="sequential", status="new", action="write")
        prev = ' '
        do ii = 1, AMAX
            if (revision .gt. 1) then
                ! read previous contents as a string
                read(oldfile, "(A)") prev
                prevlen = len(trim(prev))
            else
                prevlen = 1
            end if
            ! write previous and new contents
            write(newfile, "(A, I4, ',')") prev(1:prevlen), coldata(ii)
        end do
        ! delete the previous file
        if (revision .gt. 1) close(oldfile, status='delete')
        close(newfile)
     end subroutine
  end module

  program main
     use mod_helper

     call init
     call addcolumn('col')
     call increment(1)
     call addcolumn('col')
     call increment(20)
     call addcolumn('col')
  end program

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-19
    • 1970-01-01
    • 2021-10-26
    • 1970-01-01
    相关资源
    最近更新 更多