2013-02-27 58 views
0

我正在尝试使用fortran编写一个逗号分隔文件以导入另一个商业软件包。问题是我的数据列数量未知。我的输出需要看起来像这样:具有未知列的格式声明

a_string,a_float,a_different_float,float_array_elem1,float_array_elem2,...,float_array_elemn 

,这将导致一些看起来像这样的:

L1080,546876.23,4325678.21,300.2,150.125,...,0.125 
L1090,563245.1,2356345.21,27.1245,...,0.00983 

我有三个问题。其中,我宁愿将元素紧紧地分组(可变列宽),我不知道如何在格式语句中定义可变数量的数组元素,以及三个数组元素可以跨越很大的范围 - 可能是12个数量级。下面的代码在概念上我想要做什么,但是变量“n”和缺少列宽度定义抛出(当然)的错误:

WRITE(50,900) linenames(ii),loc(ii,1:2),recon(ii,1:n) 
900 FORMAT(A,',',F,',',F,n(',',F)) 

(我应该注意到,N为固定在运行时)当我写WRITE(50,*)时,写语句做了我想要的,除了它是用宽度分隔的。

我觉得这个帖子几乎回答了我的问题,但我很困惑:SO。现在我有一个awk修复这个问题的shell脚本,但是这个解决方案是......不雅观的。我可以做一些操作来使输出成为一个字符串,然后直接写出来,但是我宁愿尽可能避免使用这个选项。

我在Fortran 90中这样做,但我想尽量保持我的代码尽可能向后兼容。

+0

我还应该注意到,我想要紧列的原因是双重的:其一,这是对下一个程序的期望输入,以及两个大小。结果输出文件中可能有几百万行,并有许多列。空间有所作为!谢谢 – 2013-02-27 17:56:25

回答

1

接近你想要的格式是f0.3,这将不会给出空格和固定的小数位数。我想如果你想要消除拖尾的零点,你需要做很多工作。

写入语句中的'n'可能大于数据值的数量,所以一种(老派)方法是在那里放一个大数字,例如100000.现代fortran确实有一些语法来指定不确定重复,我敢肯定有人会提供。

----编辑 无限重复是您可能已经猜到了asterisk..and是evideltly“全新”的F2008

1

为了确保在您的线路的条目之间没有发生空间中,可以在字符变量分别写它们,然后使用adjustl()功能在FORTRAN打印出来:

program csv 
    implicit none 

    integer, parameter :: dp = kind(1.0d0) 
    integer, parameter :: nn = 3 
    real(dp), parameter :: floatarray(nn) = [ -1.0_dp, -2.0_dp, -3.0_dp ] 
    integer :: ii 
    character(30) :: buffer(nn+2), myformat 

    ! Create format string with appropriate number of fields. 
    write(myformat, "(A,I0,A)") "(A,", nn + 2, "(',',A))" 
    ! You should execute the following lines in a loop for every line you want to output 
    write(buffer(1), "(F20.2)") 1.0_dp ! a_float 
    write(buffer(2), "(F20.2)") 2.0_dp ! a_different_float 
    do ii = 1, nn 
    write(buffer(2+ii), "(F20.3)") floatarray(ii) 
    end do 
    write(*, myformat) "a_string", (trim(adjustl(buffer(ii))), ii = 1, nn + 2) 

end program csv 

上面的示范是仅针对一个输出线,但可以很容易地写出围绕相应块到环路为所有输出行执行它。另外,如果您愿意,您可以为不同的条目选择不同的数字格式。

+0

曾经在这里,你可以轻松多走一步,去除尾随零(可能会写一个简单的修剪类似的函数,修剪空间或0.) – agentp 2013-02-28 00:20:45