【问题标题】:FORTRAN looping lines and character positions?FORTRAN循环行和字符位置?
【发布时间】:2012-07-29 13:42:09
【问题描述】:

我正在尝试使用 FORTRAN 77 遍历文档中的所有行,并将特定行位置与字符串进行比较,然后对其进行编辑。

例如:

|BXK   |00640.3A  |AWP |1.01|
|BUCKEYE MUNICIPAL AIRPORT                                             |08794|

我想把第二行的08794改成0871994

这是我目前所拥有的:

       PROGRAM CONVERSION
    IMPLICIT NONE
    CHARACTER(LEN=120) :: ROW
    CHARACTER(LEN=2) :: DATE1='19', DATE2='20'
    INTEGER :: DATENUMBER
    INTEGER :: J

    OPEN(UNIT=1, FILE='BXK__96B.TXT', STATUS ='OLD')
    OPEN(UNIT=2, FILE='BXK__96B_MODIFIED.TXT', STATUS='UKNOWN')

    DO J=1,10000
    READ(1,'(A)') ROW
        IF (J==2) THEN
            DATENUMBER = ICHAR(ROW(76))
            IF ((DATENUMBER.LE.9) .AND. (DATENUMBER.GE.2)) THEN
                WRITE(2, '(A)' ROW(1:75), DATE1, ROW(76:120))
            ELSE 
                WRITE(2, '(A)' ROW(1:75), DATE2, ROW(76:120))
            ENDIF
        END IF
    END DO
    CONTINUE
    CLOSE(1)
    CLOSE(2)

    END

【问题讨论】:

  • 您的某些代码丢失了。你已经开始了一个 DO 循环,但没有结束它;而且您没有任何读取或写入权限。
  • 你的代码不是Fortran 77,为什么要写F77的代码?
  • 如果您需要解析文本,您很可能需要内部函数“index”和/或“scan”,使用它们您可以识别分隔符的位置并将一行拆分为单独的列,修改你需要的,然后把所有的东西都写回去。

标签: fortran fortran77


【解决方案1】:

啊,你的意思是,你想将第 2 行右端的 2 位年份表示转换为 4 位表示。您似乎已经知道如何找到年度首位数字的位置,即 76。这比您写的要容易

integer :: year
.
.
.
read(line(76:77),'(i2)') year  ! this reads year from the characters in positions 76,77
if (20<=year.and.year<=90) then  ! not sure if this precisely your test
   year = year+1900
else
   year = year+2000
end if

write(line(76:79),'(i4)') year

我没有费心将它集成到您​​的其余代码中,如果不寻求更多帮助,那应该很简单。

实际上,我想您可能还没有弄清楚如何从第 2 行中找到要开始读取年份的列。具体如何执行取决于文件的实际格式。您需要熟悉的功能是,其中一位 cmet 告诉您INDEXSCAN

如果您要在第 2 行中第二次出现 | 之后查找第 4 个字符,您可以这样做:

integer :: posn_of_2nd_vertical_bar
.
.
.
posn_of_2nd_vertical_bar = scan(row(scan(row,'|')+1:),'|')

然后将常量 76 替换为 posn_of_2nd_vertical_bar+4

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-25
    • 2014-01-07
    相关资源
    最近更新 更多