Ordonner des données avec Fortran90
Eldude
-
cchristian Messages postés 928 Statut Membre -
cchristian Messages postés 928 Statut Membre -
Bonjour à tous,
Je suis débutant en Fortran et je souhaite écrire un script capable de lire un fichier composé de 3 colonnes et de N lignes :
PROGRAM LECTUREFICHIER
IMPLICIT NONE
INTEGER :: I
INTEGER,PARAMETER :: N=100
REAL*8, DIMENSION(N,3)::MATRICE
OPEN(UNIT=10,FILE='fichier.dat',STATUS='OLD')
DO I=1,N
READ(10,*) MATRICE(I,1),MATRICE(I,2),MATRICE(I,3)
ENDDO
close(10)
END PROGRAM LECTUREFICHIER
Je suis alors obligé de déclarer le nombre de ligne à l'avance (ici N=100). Est-il possible de ne pas imposer une valeur à N afin de pouvoir lire des fichiers de taille quelconque ?
J'aimerai ensuite (compliquer les choses) ordonner les lignes de manière à ce que la dernière colonne (MATRICE(I,3)) soit rangée dans l'ordre croissant. Je n'arrive pas à trouver de module capable de faire cela...
Quelqu'un l'aurai t-il déjà fait ??
Merci d'avance : )
Seb
Je suis débutant en Fortran et je souhaite écrire un script capable de lire un fichier composé de 3 colonnes et de N lignes :
PROGRAM LECTUREFICHIER
IMPLICIT NONE
INTEGER :: I
INTEGER,PARAMETER :: N=100
REAL*8, DIMENSION(N,3)::MATRICE
OPEN(UNIT=10,FILE='fichier.dat',STATUS='OLD')
DO I=1,N
READ(10,*) MATRICE(I,1),MATRICE(I,2),MATRICE(I,3)
ENDDO
close(10)
END PROGRAM LECTUREFICHIER
Je suis alors obligé de déclarer le nombre de ligne à l'avance (ici N=100). Est-il possible de ne pas imposer une valeur à N afin de pouvoir lire des fichiers de taille quelconque ?
J'aimerai ensuite (compliquer les choses) ordonner les lignes de manière à ce que la dernière colonne (MATRICE(I,3)) soit rangée dans l'ordre croissant. Je n'arrive pas à trouver de module capable de faire cela...
Quelqu'un l'aurai t-il déjà fait ??
Merci d'avance : )
Seb
A voir également:
- Ordonner des données avec Fortran90
- Fuite données maif - Guide
- Trier des données excel - Guide
- Sauvegarde des données - Guide
- Effacer les données de navigation sur android - Guide
- Excel validation des données liste - Guide
1 réponse
Bonjour,
Une petite réflexion au sujet du cas que tu soumets:
Une petite réflexion au sujet du cas que tu soumets:
PROGRAM LECTUREFICHIER
IMPLICIT NONE
INTEGER :: IO_RC = 0
INTEGER :: CPT_ENREG = 0, CPT_ENR_TRIES = 0
CHARACTER,PARAMETER :: F_NAME*16 = 'fichier.dat'
CHARACTER IO_ORDRE*16
INTEGER :: I = 0, J = 0
! Je suis alors obligé de déclarer le nombre de ligne à l'avance
! (ici N=100).
! Est-il possible de ne pas imposer une valeur à N afin de pouvoir
! lire des fichiers de taille quelconque ?
! Le problème réside dans la déclaration du tableau recueillant
! les valeurs de chaque enregistrement du fichier. J'ai forcé ici
! la valeur de N à 9999 et j'ai utilisé une déclaration ajustable
! (1:N,.) 'Adjustable array declarator'.
! Mais je présume que la taille mémoire effectivement réservée
! est maximale: (9999 x 8 x 3).
INTEGER,PARAMETER :: N=9999
REAL*8, DIMENSION(1:N,3):: MATRICE
! Zone tampon servant, lors du tri, à la permutation des 3 valeurs
! de chaque enregistrement stockées dans le tableau MATRICE.
REAL*8, DIMENSION(3) :: S_MATRICE
OPEN (UNIT=10, FILE=F_NAME, STATUS='OLD')
IO_ORDRE = 'READ'
! Copie des enregistrements dans MATRICE.
DO WHILE ( IO_RC == 0 )
I = I + 1
READ(UNIT=10,FMT=*, IOSTAT=IO_RC) MATRICE(I,1),MATRICE(I,2),MATRICE(I,3)
IF (IO_RC .eq. -1) THEN
PRINT *,F_NAME, ': RC: ', IO_RC,' SUR ORDRE : ', IO_ORDRE
PRINT *,F_NAME,': Nb.d''enreg. lus/affiches: ', CPT_ENREG
ELSE
PRINT *, MATRICE(I,1),MATRICE(I,2),MATRICE(I,3)
CPT_ENREG = CPT_ENREG + 1
ENDIF
ENDDO
CLOSE (10)
! J'aimerai ensuite (compliquer les choses) ordonner les lignes de
! manière à ce que la dernière colonne (MATRICE(I,3)) soit rangée
! dans l'ordre croissant. Je n'arrive pas à trouver de module
! capable de faire cela...
! Tri des postes sur le critère: MATRICE(I, 3) (Si j'ai bien
! compris).
DO I = 1, CPT_ENREG - 1, 1
J = I + 1
DO WHILE ( J <= CPT_ENREG )
IF ( MATRICE (I,3) > MATRICE(J,3) ) THEN
S_MATRICE (1) = MATRICE(I, 1)
S_MATRICE (2) = MATRICE(I, 2)
S_MATRICE (3) = MATRICE(I, 3)
MATRICE (I, 1) = MATRICE(J, 1)
MATRICE (I, 2) = MATRICE(J, 2)
MATRICE (I, 3) = MATRICE(J, 3)
MATRICE (J, 1) = S_MATRICE(1)
MATRICE (J, 2) = S_MATRICE(2)
MATRICE (J, 3) = S_MATRICE(3)
END IF
J = J + 1
END DO
END DO
OPEN (UNIT=10, FILE=F_NAME, STATUS='OLD')
! Ecriture dans le même fichier des postes triés.
IO_ORDRE = 'WRITE'
DO I = 1, CPT_ENREG
WRITE(UNIT=10,FMT=*, IOSTAT=IO_RC) MATRICE(I,1),MATRICE(I,2),MATRICE(I,3)
IF (IO_RC .ne. 0 ) THEN
PRINT *,F_NAME, ': RC: ', IO_RC,' SUR ORDRE : ', IO_ORDRE
PRINT *,F_NAME,': Anomalie écriture du ', CPT_ENREG, 'enreg.'
ELSE
PRINT *, MATRICE(I,1),MATRICE(I,2),MATRICE(I,3)
CPT_ENR_TRIES = CPT_ENR_TRIES + 1
ENDIF
END DO
PRINT *,F_NAME,': Nb.d''enreg. tries et ecrits: ', CPT_ENR_TRIES
CLOSE (10)
END PROGRAM LECTUREFICHIER
! Sur ce jeu d'essais en entrée:
! 1.00000000000 2.00000000000 3.00000000300
! 1.00000000000 2.00000000000 3.00000000200
! 1.00000000000 2.00000000000 3.00000000100
! 1.00000000000 2.00000000000 3.00000000100
! 1.00000000000 2.00000000000 3.00000000300
! 1.00000000000 2.00000000000 3.00000000200
! 1.00000000000 2.00000000000 3.00000000100
! 1.00000000000 2.00000000000 3.00000000200
! 1.00000000000 2.00000000000 3.00000000300
!
! Ca donne cela:
!
! fichier.dat : RC: -1 SUR ORDRE : READ
! fichier.dat : Nb.d'enregistrements lus/affiches: 9
! 1.00000000000 2.00000000000 3.00000000100
! 1.00000000000 2.00000000000 3.00000000100
! 1.00000000000 2.00000000000 3.00000000100
! 1.00000000000 2.00000000000 3.00000000200
! 1.00000000000 2.00000000000 3.00000000200
! 1.00000000000 2.00000000000 3.00000000200
! 1.00000000000 2.00000000000 3.00000000300
! 1.00000000000 2.00000000000 3.00000000300
! 1.00000000000 2.00000000000 3.00000000300
!fichier.dat : Nb.d'enregistrements tries et ecrits: 9