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

时间:2011-08-20 07:16:19

标签: excel csv plot fortran

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

5 个答案:

答案 0 :(得分:10)

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

write (1, '(1x, F, 3(",", F))') a(1), a(2), a(3), a(4)

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

答案 1 :(得分:9)

我还推荐FLIBS的csv_file模块。 Fortran可以很好地读取csv文件,但写的并不多。使用csv_file模块,您可以输入

    use csv_file

在函数/子例程的开头,然后用:

调用它
    call csv_write(unit, value, advance)

其中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

输出:

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)

这是非常复杂的,需要您知道您的值所具有的最大位数。

我强烈建议使用csv_file模块。这无疑让我感到很沮丧。

答案 2 :(得分:2)

使用搜索引擎工作几十秒就会找到FLIBS库,其中包含一个名为csv_file的模块,它会写出字符串,标量和数组格式为CSV格式。

答案 3 :(得分:2)

以下是我使用的(与G95一起使用):

write(unit,'(999(G21.6,:,","))')array or data structure containing number or character variables

英特尔编译器识别

write(unit,'(*(G0.6,:,","))')array or data structure

没有多余的空白,该行可以有超过999列。

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

write(Buf,'(999(G21.6,:,","))')array or data structure
call CSV_write(unit,Buf)

您也可以使用

write(Buf,*)array or data structure
call CSV_write(unit,Buf)

你的CSV_write程序用","替换空格。在Buf。这是有问题的,因为除非有额外的空白,否则它不会分隔字符变量(即' a'' abc'可以)。

答案 4 :(得分:1)

我认为没有任何其他库的完整简单示例可能会有所帮助。我假设您正在使用矩阵,因为您想从Excel进行绘图(在任何情况下都可以轻松扩展示例)。

tl; dr

使用format(1x, *(g0, ", "))格式一次循环打印一行

完整的故事

以下代码的目的是以CSV格式(您可以轻松地在Excel中导入)编写一个(3x4)矩阵。 重要的行是标记为101的行。它设置格式。

program testcsv
   IMPLICIT NONE 

   INTEGER :: i, nrow
   REAL, DIMENSION(3,4) :: matrix

   ! Create a sample matrix
   matrix = RESHAPE(source = (/1,2,3,4,5,6,7,8,9,10,11,12/), &
                    shape = (/ 3, 4 /))

   ! Store the number of rows
   nrow = SIZE(matrix, 1) 

   ! Formatting for CSV
   101 format(1x, *(g0, ", ")) 
   
   ! Open connection (i.e. create file where to write)
   OPEN(unit = 10, access = "sequential", action = "write", &
        status = "replace", file = "data.csv", form = "formatted") 
   ! Loop across rows
   do i=1,3
      WRITE(10, 101) matrix(i,:)
   end do 
   ! Close connection
   CLOSE(10)


end program testcsv

我们首先创建样本矩阵。然后将行数存储在变量 nrow 中(这在您不确定矩阵尺寸时很有用)。跳过第二个format语句。接下来,我们要做的是打开(创建或替换)名为 data.csv 的CSV文件。然后,我们遍历矩阵的行( do 语句)以一次在CSV文件中写入一行( write 语句);行将一个接一个地添加。

更详细地说明 write 语句的工作方式是: WRITE(U,FMT)什么。我们将“ what”(矩阵的第i行:matrix(i,:))写入连接U(使用 open 语句创建的连接),格式化 FMT的内容。

请注意,在示例FMT = 101中,101是我们的 format 语句的标签:

format(1x, *(g0, ", ")) 

它的作用是:“ 1x”在行的开头插入一个空格; “ *”用于无限格式重复,这意味着对于要打印的对象中剩余的所有数据(即矩阵行中的所有元素)重复以下括号中的格式。因此,每个行号的格式为:'g0, ", "'。 g是通用格式描述符,可处理浮点数以及字符,逻辑和整数;尾随的0基本上意味着:“使用最少的空间来容纳要格式化的对象”(避免不必要的空间)。然后,在格式化的数字后,我们需要用逗号加上一个空格:**“,”。这将为矩阵的一行生成我们的逗号分隔值(如果需要,可以使用其他分隔符代替“,”)。我们为每一行重复一次,就是这样。

(实际上并不需要格式中的空格,因此可以使用format(*(g0,","))

参考:Metcalf,M.,Reid,J.,&Cohen,M.(2018)。 Modern Fortran解释:合并Fortran2018。牛津大学出版社。