La première étape est de lire les données. Dans les instructions suivantes, nous allons d'abord boucler le fichier et compter le nombre de lignes, nrows
. Cette valeur sera utilisée pour allouer un tableau de données à la taille nécessaire. Nous revenons ensuite au début du fichier et lisons dans nos données dans une deuxième boucle. Déclarer une variable entière pour agir en tant que gestionnaire/référence de fichier.
- Déclarez un tableau allouable de réels (flottants) pour contenir les données.
- En boucle sur le fichier à count the number of lines in the file. Supprimer les lignes d'en-tête du compte. Allouer le tableau de données à la taille appropriée,
(nrows,nvalues)
.
- Retour au début du fichier. Répétez la boucle sur chacune des lignes, en lisant toutes les valeurs de la ligne dans votre tableau de données.
- Fermez le fichier.
L'étape suivante est de créer 5 nouveaux fichiers, contenant chacun le temps et l'une des 5 mesures de propriété:
- boucle sur chacune des 5 propriétés contenues dans
data
.
- Pour chaque propriété
j
th, ouvrez un nouveau fichier.
- Parcourez le tableau
data
en écrivant l'heure et la propriété j
th sur une nouvelle ligne.
- Fermez le fichier.
Voici le code de travail, vous pouvez utiliser ou modifier selon vos besoins:
program SO
implicit none
integer :: i, j, nrows, nvalues, funit, ios
real, allocatable, dimension(:,:) :: data
character(len=10), dimension(5) :: outfiles
!! begin
nvalues = 5
nrows = 0
open(newunit=funit, file='example.txt', status='old', iostat=ios)
if (ios /= 0) then
print *, 'File could not be opened.'
call exit
else
do
read(funit,*,iostat=ios)
if (ios == 0) then
nrows = nrows + 1
elseif (ios < 0) then !! End of file (EOF).
exit !! The 'exit' stmt breaks out of the loop.
else !! Error if > 0.
print *, 'Read error at line ', nrows + 1
call exit() !! The 'exit' intrinsic ends the program.
endif !! We we may pass an optional exit code.
enddo
endif
nrows = nrows - 1 !! 'nrows-1': Remove column headers from count.
if (allocated(data)) deallocate(data) !! This test follows standard "best practices".
allocate(data(nrows,nvalues+1))
rewind(funit)
read(funit, *) !! Skip column headers.
do i = 1,nrows
read(funit, *) data(i,:) !! Read values into array.
enddo
close(funit)
!! Output file names.
outfiles = ['prop1.txt', 'prop2.txt', 'prop3.txt', 'prop4.txt', 'prop5.txt']
do j = 1,nvalues
open(newunit=funit, file=outfiles(j), status='replace', iostat=ios)
if (ios /= 0) then
print *, 'Could not open output file: ',outfiles(j)
call exit()
endif
write(funit,"(a)") "time "//outfiles(j)(1:5)
do i = 1,nrows
write(funit,"(f0.0,t14,es14.6)") data(i,1), data(i,j+1)
enddo
close(funit)
enddo
end program SO