Как записать вывод Fortran в виде файла CSV? - PullRequest
8 голосов
/ 20 августа 2011

Может кто-нибудь сказать мне, как я могу написать свой вывод программы Fortran в формате CSV? Таким образом, я могу открыть файл CSV в Excel для печати данных.

Ответы [ 4 ]

10 голосов
/ 20 декабря 2011

Несколько более простой вариант оператора записи может быть:

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

Конечно, это работает, только если ваши данные являются числовыми или легко повторяемыми.Вы можете оставить форматирование в вашей программе для работы с электронными таблицами или быть более точным здесь.

9 голосов
/ 22 августа 2011

Я бы также порекомендовал модуль csv_file из FLIBS . 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(1,'(I1,A,I1,A,I1)') a(1),',',a(2),',',a(3)
    write(1,'(I1,A,I1)') b(1),',',b(2)

, который очень запутан и требует, чтобы вы знали максимальное количество цифр, которые будут иметь ваши значения.

Я бы настоятельно рекомендовал использовать модуль csv_file. Это, безусловно, спасло меня от многих часов разочарования.

2 голосов
/ 17 мая 2016

Вот что я использую (работает с G95):

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

Компилятор Intel распознает

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» в порядке).

2 голосов
/ 20 августа 2011

Десятки секунд работы с поисковой системой находит мне библиотеку FLIBS , которая включает в себя модуль csv_file, который будет записывать строки, скаляры и массивы в формате CSV.1006 *

...