如何将Fortran输出写为CSV文件?

aib*_*k01 8 csv excel plot fortran

任何人都可以告诉我,如何以CSV格式编写Fortran程序的输出?所以我可以在Excel中打开CSV文件来绘制数据.

Mik*_*ike 10

一个稍微简单的write语句版本可能是:

write (1, '(1x, F, 3(",", F))') a(1), a(2), a(3), a(4)
Run Code Online (Sandbox Code Playgroud)

当然,这只适用于您的数据是数字或易于重复的情况.您可以将格式保留在电子表格程序中,也可以在此处更明确.


ban*_*ish 9

我也建议从csv_file模块FLIBS.Fortran可以很好地读取csv文件,但写入它们并不是很多.使用csv_file模块,你放了

    use csv_file
Run Code Online (Sandbox Code Playgroud)

在函数/子例程的开头,然后使用以下命令调用它:

    call csv_write(unit, value, advance)
Run Code Online (Sandbox Code Playgroud)

其中unit =文件单元号,value =要写入的数组或标量值,advance = .true.或.false.取决于您是否想要前进到下一行.

示例程序:

  program write_csv

    use csv_file

    implicit none

    integer :: a(3), b(2)

    open(unit=1,file='test.txt',status='unknown')

    a = (/1,2,3/)
    b = (/4,5/)

    call csv_write(1,a,.true.)
    call csv_write(1,b,.true.)

  end program
Run Code Online (Sandbox Code Playgroud)

输出:

1,2,3

4,5

如果你只是想使用write命令,我认为你必须这样做:

    write(1,'(I1,A,I1,A,I1)') a(1),',',a(2),',',a(3)
    write(1,'(I1,A,I1)') b(1),',',b(2)
Run Code Online (Sandbox Code Playgroud)

这是非常复杂的,并要求您知道您的值将具有的最大位数.

我强烈建议使用csv_file模块.它确实为我节省了数小时的挫折感.


小智 5

Intel 和 gfortran (5.5) 编译器识别:

write(unit,'(*(G0.6,:,","))')array or data structure
Run Code Online (Sandbox Code Playgroud)

它没有多余的空格,并且该行可以有超过 999 列。

要使用 F95 删除多余的空格,请首先写入字符缓冲区,然后使用您自己的 CSV_write 程序删除多余的空格,如下所示:

write(Buf,'(999(G21.6,:,","))')array or data structure
call CSV_write(unit,Buf)
Run Code Online (Sandbox Code Playgroud)

您还可以使用

write(Buf,*)array or data structure
call CSV_write(unit,Buf)
Run Code Online (Sandbox Code Playgroud)

其中 CSV_write 程序将 Buf 中的空格替换为“,”。这是有问题的,因为它不会分隔字符变量,除非有额外的空格(即“a”,“abc”是可以的)。