Shahram Maghami
Shahram Maghami

Reputation: 7

How to read data from multiple files and write into columns of a single file

I'm completely new in Fortran and I need to write some relatively simple codes.

I have some files (various, for example 200 files); each file for the specific node, with some simplification, each file contains:

T(i), X(i)

these are my input and I want to have an output file contain:

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

the problem is that I can't separate data in different columns of output file, they comes all after each other in 1 column.

My code is :

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

The output I get is like this :

11
12
13
21
22
23
31
32
33

But in fact I want :

11    21   31
12    22   32
13    23   33

Upvotes: 0

Views: 1476

Answers (3)

Holmz
Holmz

Reputation: 724

The 2D array... for this problem it is backwards But it should give you some help... (Hopefully)

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

Upvotes: 0

There are several problems with your code

 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

The index j is completely undefined. You should put j=1 or 0 and j=j+1 somewhere inside the loop.

The other issue is your output. You are reading the files in sequence. It is very hard to print each file into a separate column. A separate row for each file is easy:

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

after the inner loop.

Or with finer control and avoiding a line wrap

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

(g0 is a general edit descriptor which uses only the necessary width). This will only work if you fix the j issue I mentioned above!

To put it into separate columns you must

  1. Open all files at the same time, then read from each of them and print the read data in a single write command.

or

  1. Store all the data from all files into separate columns in a 2D array and print the 2D array afterwards.

Upvotes: 2

bestrong
bestrong

Reputation: 151

So what I got is x(1) belongs to 11, x(2) belongs to 12, x(3) belongs to 13 and so on, isn't it? You could try this one:

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

Upvotes: 0

Related Questions