2012-07-31 62 views
0

我想通過使用FORTRAN 77遍歷文檔中的所有行,並將特定的行位置與字符串進行比較,然後進行編輯。FORTRAN循環線和字符位置?

例如爲:

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

我想改變087940871994在第二行。

這是我到目前爲止有:

 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

一些你的代碼不見了。你已經開始了DO循環,但沒有結束;並且您沒有任何讀取或寫入。 – 2012-07-31 19:10:18

+1

您的代碼不是Fortran 77,您爲什麼要在F77中編寫代碼? – haraldkl 2012-07-31 19:30:24

+0

如果你需要解析文本,你很可能需要內建函數「索引」和/或「掃描」,他們可以識別你的分隔符的位置,並將一行分割成單獨的列,修改你需要和寫的一切回來。 – haraldkl 2012-07-31 19:37:50

回答

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行第2次發生後尋找第四字符,你可以這樣來做:

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

,然後更換您的固定76 posn_of_2nd_vertical_bar+4