Код состоит из цикла выполнения и создает массивы данных до тех пор, пока работает. Мне нужно, чтобы эти массивы были добавлены в файл как новые столбцы.
Первый столбец фиксирован (длины волн), а второй генерируется в ходе первого запуска:
OPEN (unit=11,file=filename // '.csv')
WRITE(11,'(i4,A1,f10.6)') (lambda(ii),tab,resv(ii), ii=1,nw)
CLOSE(11)
lambda - это длина волны (4 цифры), tab объявлен как char(9), а resv - мои данные (плавающие). Массив состоит из nw=2000 элементов.
Первый запуск сценария дает мне хороший результат, который я могу загрузить в MS Excel как .csv. Однако сценарий должен вернуться к началу цикла, вычислить новые данные и сохранить измененные элементы "resv" в новый столбец.
Но когда я иду, как
WRITE(11,'(T17,i4,A1,f10.6)') (lambda(ii),tab,resv(ii), ii=1,nw)
новые данные действительно сохраняются в столбце 17, но все предыдущие данные удаляются! Итак, как я могу сказать Fortran "добавить" новый столбец?
Ответ 1 · cup
Попробуйте такой вариант. Посмотрите код в addcolumn. Ограничение состоит в том, что ваша строка не может быть длиннее 1024 символов. Вы можете увеличить размер массива в соответствии с вашими потребностями.
module mod_helper
integer, parameter:: AMAX = 10
integer, dimension(AMAX):: coldata
integer:: revision
contains
subroutine init
revision = 0
do ii = 1, AMAX
coldata(ii) = ii
end do
end subroutine init
subroutine increment(howmuch)
integer, intent(in):: howmuch
coldata = coldata + howmuch
end subroutine
subroutine addcolumn(csvname)
character*(*), intent(in) csvname
integer(kind=2):: status
integer:: prevlen
character(1024):: prev, oldname, newname
integer, parameter:: oldfile = 20, newfile = 30
write(oldname, "(A,I3.3,'.csv')") csvname, revision
revision = revision + 1
write(newname, "(A,I3.3,'.csv')") csvname, revision
if (revision .gt. 1) then
! Open the old file
open(oldfile, file=oldname, access="sequential", status="old")
end if
open(newfile, file=newname, access="sequential", status="new", action="write")
prev = ' '
do ii = 1, AMAX
if (revision .gt. 1) then
! read previous contents as a string
read(oldfile, "(A)") prev
prevlen = len(trim(prev))
else
prevlen = 1
end if
! write previous and new contents
write(newfile, "(A, I4, ',')") prev(1:prevlen), coldata(ii)
end do
! delete the previous file
if (revision .gt. 1) close(oldfile, status='delete')
close(newfile)
end subroutine
end module
program main
use mod_helper
call init
call addcolumn('col')
call increment(1)
call addcolumn('col')
call increment(20)
call addcolumn('col')
end program