任何人都可以告诉我,如何以CSV格式编写Fortran程序的输出?所以我可以在Excel中打开CSV文件来绘制数据。
答案 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)
答案 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进行绘图(在任何情况下都可以轻松扩展示例)。
使用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。牛津大学出版社。