【问题标题】:How to read large amount of data from files and store them in variable?如何从文件中读取大量数据并将它们存储在变量中?
【发布时间】:2019-04-24 10:45:28
【问题描述】:

我有一个文件,其中包含每个元素的压力值。我需要元素编号 (ELNO) 和压力 (PLOAD) 并通过一个子程序。我无法从文件中单独读取它们。 从 S175 开始,数据将如下所示。

我希望能够读取此文件,例如 A0001.txt,并逐行读取。在读取行时,我想将第一个点之后的数字(例如 1007、1008 等)存储到变量 ELNO 中,并将最后一个逗号之后的数字存储在循环中的变量 PLOAD 中。这是因为我需要每个 ELNO 值并使用 IF 循环检查条件。

我的问题是读取文件并将其存储在像 ELNO(i) 这样的变量中。名称 S175 是不变的。

我想我明白其中的逻辑。我必须将每个 like 存储为一个字符串,并从字符串中的第 6 个位置开始迭代,直到找到第一个“,”并将其存储在 ELNO(i) 中。但我是 FORTRAN 的新手,无法获得它。过去一周我一直在尝试学习 FORTRAN 来做到这一点。但是,无法解决这个问题。

我在下面尝试了这样的代码,但它没有逐行读取,因为我猜我没有把它放在一个循环下。

     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

【问题讨论】:

  • 谢谢。我没有看到这个。我试过谷歌搜索,但没有找到这个例子。在此期间我已经做到了。可能有更好的方法。我是新手,所以这可能不是最好的方法。

标签: fortran fortran90


【解决方案1】:

谢谢大家。我自己完成了。可能有一种更简单、更快捷的方法,但这很好用。让我知道是否有更有效的方法。我可以学习。 :)

   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

【讨论】:

    【解决方案2】:

    使用 Fortran 的 list-directed 输入从诸如S175.1019,P,0.222425 之类的行中读取数据项会很容易。以下 sn-p 可以替换 OP 自己的答案中的 do 循环:

    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 个和后续字符中读取三个变量(一个整数、一个字符、一个实数)的值987654328@。

    幸运的是,有了一个干净整洁的输入文件,例如编译器在读取值时不会遇到问题,所有出现的, 的扫描都是不必要的。如果对于另一个应用程序,您需要在一行中搜索出现的字符,请使用内部函数 index

    【讨论】:

    • 非常感谢。我对 FORTRAN 很陌生。您的回答帮助我学习了更好的方法。 :)
    猜你喜欢
    • 1970-01-01
    • 2015-06-03
    • 2013-12-14
    • 2014-05-17
    • 1970-01-01
    • 2016-03-04
    • 2021-06-09
    • 1970-01-01
    • 2017-08-19
    相关资源
    最近更新 更多