2013-02-27 55 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