我正在尝试使用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
答案 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行开始读取年份的列。确切地说,你如何做到这一点取决于你的文件格式究竟是什么。您需要熟悉的功能是,其中一条评论告诉您INDEX
和SCAN
。
如果您在第2行|
第二次出现后正在寻找第4个字符,您可以这样做:
integer :: posn_of_2nd_vertical_bar
.
.
.
posn_of_2nd_vertical_bar = scan(row(scan(row,'|')+1:),'|')
然后用posn_of_2nd_vertical_bar+4