【问题标题】:How to read data from multiple files and write into columns of a single file如何从多个文件中读取数据并写入单个文件的列
【发布时间】:2016-07-25 16:46:30
【问题描述】:

我是Fortran新手,需要写一些比较简单的代码。

我有一些文件(各种,例如 200 个文件);特定节点的每个文件,经过一些简化,每个文件包含:

T(i), X(i)

这些是我的输入,我希望输出文件包含:

T(i) X(i)1 X(i)2 ... X(i)n

问题是我无法将输出文件不同列中的数据分开,它们在 1 列中一个接一个地出现。

我的代码是:

PROGRAM Output

implicit none
integer ::nn,n,i,j,l
real,dimension(:),allocatable::t,x,y,z
character(len=10)::TD 

open(11,file='outputX.txt')
allocate (t(1000),x(1000),y(1000),z(1000)) 

n=5                  ! Number of Files
nn=50                ! Number of Rows in each File
 Do i=1,n            ! loop for opening different files 
   write(TD,10)i 
   write(*,*)TD 
   open(1,file=TD) 

      Do l=1,nn      ! loop for reading rows in each file
        read(1,*)t(j),x(j)
        write(11,*)x(j) !!!! This is my PROBLEM, all the data shows in
                               ! one column, I want each file in separately
      Enddo

 Enddo

    10  format('100',i3.3,'') 

    deallocate(x,y,z,t) 
    END PROGRAM Output

我得到的输出是这样的:

11
12
13
21
22
23
31
32
33

但其实我想要:

11    21   31
12    22   32
13    23   33

【问题讨论】:

  • 每个write 都会产生一行(“记录”)。您需要将编写的各种值组合到单个输出语句中。比如this questionthis question

标签: fortran fortran90


【解决方案1】:

你的代码有几个问题

 Do i=1,n            ! loop for opening different files 
   write(TD,10)i 
   write(*,*)TD 
   open(1,file=TD) 
   Do l=1,nn      ! loop for reading rows in each file
     read(1,*)t(j),x(j)
     write(11,*)x(j) !!!! This is my PROBLEM, all the data shows in
                               ! one column, I want each file in separately
  End do
End do

索引j 完全未定义。您应该将j=10j=j+1 放在循环内的某个位置。

另一个问题是你的输出。您正在按顺序读取文件。很难将每个文件打印到单独的列中。每个文件单独一行很简单:

write(11,*) x(1:nn)

内部循环之后。

或者通过更精细的控制并避免换行

write(11,'999(g0,1x)') x(1:nn)

(g0 是一个通用的编辑描述符,它只使用必要的宽度)。这只有在你解决了我上面提到的j 问题时才有效!

要将其放入单独的列中,您必须

  1. 同时打开所有文件,然后从每个文件中读取并在单个写入命令中打印读取的数据。

  1. 将所有文件中的所有数据存储到二维数组的单独列中,然后打印二维数组。

【讨论】:

  • 我得到了答案:Read(1,*)(t(j),x(j),j=1,nn) Write(11,200)(x(j),j= 1,nn) 正如你所说的行,而不是列。谢谢
【解决方案2】:

所以我得到的是x(1) belongs to 11x(2) belongs to 12x(3) belongs to 13 等等,不是吗?你可以试试这个:

write(11,100) x(j), x(j+3), x(j+6)
100 format(1X,11F20.4,11F20.4,11F20.4)

【讨论】:

  • 我不会向初学者展示 FORMAT 语句作为现代代码的示例。
  • @VladimirF:你对某人的所作所为发表了太多评论。如果您不想显示FORMAT语句,也许您也可以通过回答作者来帮助他...是的,谢谢您的建议,我已经删除了以前的答案。
  • @VladimirF:我认为您也没有正确阅读作者的上述问题。他甚至在他的代码上写了 FORMAT 语句。
  • 对OP的评论是必要的。那应该被删除。我尝试建议如何改进您的答案。是的,回答自己并不难。我也为新用户提供机会并尝试提供帮助,但感谢您的反馈,如果您介意的话,就不再给您了。
  • @VladimirF:关于 OP,即使在我之前的帖子中,我也始终遵循您的建议。我不怀疑你,因为我确实应该删除我以前的答案并且我已经做到了。问题是你说,你不会向初学者展示 FORMAT 语句(在这种情况下是作者),即使你没有看到作者自己使用 FORMAT 语句编写。这就是为什么我试图帮助他使用 FORMAT 语句。我确定它不受现代 Fortran 的约束。但是我们在这个网站上的目标是互相帮助解决他/她的问题,对吗?无论如何,也谢谢你。
【解决方案3】:

二维数组...对于这个问题,它是倒退的 但它应该能给你一些帮助......(希望)

PROGRAM Output
IMPLICIT NONE
INTEGER, PARAMETER              :: nfiles = 5
INTEGER, PARAMETER              :: nrows  = 50
integer                         :: iFile, iRow   !File and row counter/#
real,dimension(:,:),allocatable :: t,x,y,z       !The are now 2D
INTEGER,dimension(nFiles)       :: lFile         !logical file indexed by file#
LOGICAL,dimension(nFiles)       :: Open4Biz      !logical for closing
character(len=10)::TD                            !Unsure about this

open(11,file='outputX.txt')
allocate (t(iRow,iFile),x(iRow,iFile),y(iRow,iFile),z(iRow,iFile)) 

Open4Biz(:) = .FALSE.                            !Initialize

!n=5                  ! Number of Files              ^^Moved up/renamed^^
!nn=50                ! Number of Rows in each File  ^^Moved up/renamed^^
 Files_Loop1: Do iFile = 1, nFiles     !I think that the loop identifier is std f95 (std ifort anyhow)
   write(TD,10) iFile          !Unsure about this
   write(*,*)TD 
   lFile(iFile) = 10+iFile
   open(lFile(iFile),file=TD)  !Probably put in some logic if the file is not found
   Open4Biz(iFile) = .TRUE.
 ENDDO Files_Loop1

 Rows_Loop: Do iRow = 1, nn                !The loops are backwards from normal
   Files_Loop2: Do iFile = 1, nFiles
     read(lFile(iFile),*) t(iRow, iFile), x(iRow, iFile)
   Enddo Files_Loop2
   write(11,*) x(iRow,:)
 Enddo Rows_Loop

10  format('100',i3.3,'')

667  CONTINUE                         !This is label to 'jump to' from a bad open
Files_Loop3: Do iFile = 1, nFiles
  IF(Open4Biz(iFile) CLOSE(lFile(iFile))
ENDDO Files_Open_Loop

IF(ALLOCATED(X)) deallocate(x) 
IF(ALLOCATED(Y)) deallocate(y) 
IF(ALLOCATED(Z)) deallocate(z) 
IF(ALLOCATED(T)) deallocate(t)
END PROGRAM Output

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-05-23
    • 1970-01-01
    • 2020-04-26
    • 2021-04-02
    • 1970-01-01
    • 2021-01-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多