FORTRAN循环线和字符位置?

时间:2012-07-31 17:48:43

标签: fortran fortran77

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

E.g:

|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

1 个答案:

答案 0 :(得分:0)

啊,你的意思是,你想把第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行开始读取年份的列。确切地说,你如何做到这一点取决于你的文件格式究竟是什么。您需要熟悉的功能是,其中一条评论告诉您INDEXSCAN

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

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

然后用posn_of_2nd_vertical_bar+4

替换常量76