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
Configuration: Linux Firefox 3.0.10
1 réponse
-
Bonjour,
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