Как прочитать большое количество данных из файлов и сохранить их в переменной? - PullRequest
0 голосов
/ 24 апреля 2019

У меня есть файл, в котором есть значения давления для каждого элемента.Мне требуется номер элемента (ELNO) и давление (PLOAD) и пройти через подпрограмму.Я не могу читать их отдельно от файла.Данные будут выглядеть так, как показано ниже, начиная с S175 ..

. Я хочу иметь возможность прочитать этот файл, скажем, A0001.txt, и прочитать строки одну за другой.При чтении строк я хочу сохранить число после первой точки, например, 1007, 1008 и т. Д., В переменную ELNO и число после последней запятой в переменной PLOAD в цикле.Это потому, что мне потребуется каждое значение ELNO и проверка условия с помощью цикла IF.

Моя проблема заключается в чтении файла и сохранении в переменной типа ELNO (i) чего-то подобного.Имя S175 является постоянным.

Мне кажется, я понимаю логику.Я должен сохранить каждый лайк как строку и начать итерацию с 6-й позиции в строке, пока он не найдет первое "," и сохранить его в ELNO (i).Но я новичок в Фортране и не могу его получить.В течение прошлой недели я пытался научиться делать это на Фортране.Но, не в состоянии сделать эту проблему.

Я попробовал подобный код ниже, но он не читал построчно, так как я не помещал его в цикл, я думаю.

     S175.1007,P,0.221948
     S175.1008,P,0.221943
     S175.1009,P,0.221929
     S175.1010,P,0.222287
     S175.1018,P,0.222438
     S175.1019,P,0.222425
     .....
     .....
     .....
     .....
     .....
     S175.13000,P,-1990
     S175.13001,P,-1980
     S175.13002,P,-2009

  PROGRAM BARGE 
     implicit none    
     CHARACTER X*80
     OPEN(UNIT=60, FILE="A0001.txt", ACCESS='SEQUENTIAL', ACTION='READ')
     READ(UNIT=60, FMT='(A)', END=10)X
  10 OPEN(UNIT=61, FILE="2.txt", ACTION="write")
     WRITE (UNIT=61,FMT='(A)')X 


  END PROGRAM BARGE

Ответы [ 2 ]

1 голос
/ 24 апреля 2019

Было бы легко использовать направленный на список ввод Fortran для чтения элементов данных из строки, такой как S175.1019,P,0.222425.Следующий фрагмент может заменить цикл do в собственном ответе OP:

DO
  READ(UNIT=60, FMT='(A)', IOSTAT=SUCCESS) PRES
  IF (SUCCESS.NE.0) EXIT
  READ(PRES(6:),*) ELNO, P, PLOAD
  WRITE(*,*) ELNO, PLOAD
END DO

Чтобы это работало, вы должны включить объявление, такое как

CHARACTER(LEN=1) :: P

, чтобы поймать букву P в каждой строке входного файла.Важной строкой является

READ(PRES(6:),*) ELNO, P, PLOAD

, в которой используется дескриптор редактирования *, который указывает компилятору / среде выполнения выяснить, как считывать значения для трех переменных (одно целое, один символ, одинреальный) от 6-го и последующих символов в строке PRES.

К счастью, с хорошим чистым входным файлом, таким как показанный, у компилятора нет проблем с чтением значений, все сканирование на наличие , не требуется.Если для другого приложения вам когда-либо понадобится найти строку для вхождения символа, используйте встроенную функцию index.

0 голосов
/ 24 апреля 2019

Спасибо всем. Я закончил это сам. Там может быть более простой и быстрый способ, но это работает отлично. Дайте мне знать, если есть более эффективный метод. Я мог бы учиться. :)

   PROGRAM BARGE    
     implicit none    
     CHARACTER PRES*80       
     INTEGER  :: SUCCESS
     INTEGER  :: K, L, M, ELNO    ! K is for the element number,L is word P and M is for pressure value
     REAL     :: PLOAD
     OPEN(UNIT=60, FILE="1.txt", ACCESS='SEQUENTIAL', ACTION='READ')
     DO
        READ(UNIT=60, FMT='(A)', IOSTAT=SUCCESS)PRES
        IF (SUCCESS.NE.0) EXIT
        K=6
        DO WHILE (PRES(K:K) .NE. ',')
           K=K+1
        END DO          

        READ(PRES(6:K-1), *) ELNO
        PRINT *, ELNO     ! ELEMENT NUMBER          
        L=K+1

        DO WHILE (PRES(L:L) .NE. ',')
           L=L+1
        END DO


        M=L+1

        DO WHILE (PRES(M:M) .NE. ' ')
           M=M+1
        END DO

        READ(PRES(L+1:M-1), *) PLOAD     ! PRESSURE ON THE ELEMENT      
        PRINT *, PLOAD      

        OPEN(UNIT=61, FILE="2.txt", ACTION="write")
        WRITE (UNIT=61,FMT='(A)')PRES   
     END DO 
  READ (*,*) PRES
  END PROGRAM BARGE
...