[問題] 擷取檔案中某一部分數據的方式

看板Fortran作者 (Yan:))時間10年前 (2014/12/09 01:30), 10年前編輯推噓2(206)
留言8則, 2人參與, 最新討論串1/1
初學fortran 只會用簡單的計算跟一些迴圈 由於現在用軟體算出來的output 夾雜英文和數字 想請問 有沒有辦法用找特定兩個關鍵字的方式 去讀在這兩個關鍵字中的數據 再把它寫出到另一個資料夾 做了一下功課 好像是需要使用到 index bacspace 跟 do 跳行 orientation: --------------------------------------------------------------------- Center Atomic Atomic Coordinates (Angstroms) Number Number Type X Y Z --------------------------------------------------------------------- 1 6 0 2.422098 -0.365891 0.476931 2 8 0 2.669932 -1.186283 1.333641 3 8 0 3.283776 0.059986 -0.453423 4 6 0 4.606155 -0.505397 -0.372798 . . . . . . --------------------------------------------------------------------- xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx . . . . . completed 大致上的數據格式是這樣,從orientation 到completer 有大概一千行 一個檔案裏面有大約40組這樣的內容 我想的流程大概是 先尋找到completed 然後使用backspace往上搜尋找到orientation 然後使用跳行讀取跳過前面 再來讀取 X Y Z 下的數據 然後跳出到找到completed的行數接著尋找completed 但是礙於能力有限具體的方式不太了解 所以想麻煩大家指點一下 謝謝 暫時把CODE整理成這樣 但是還是沒有辦法達成目的 PROGRAM EE IMPLICIT NONE CHARACTER(LEN=80) :: TXT INTEGER :: FIOS,CN,AN,AT REAL*8 X1,Y1,Z1 OPEN(UNIT=11,FILE="Text3.txt") OPEN(UNIT=12,FILE="XYZ.TXT") DO WHILE(.TRUE.) READ(11,"(A80)",IOSTAT=FIOS) TXT IF(TXT=="Optimization completed.") THEN Backspace(11) Backspace(11) END IF DO WHILE(.TRUE.) READ(11,"(A80)",IOSTAT=FIOS) TXT IF (LEN_TRIM(TXT)/="Standard orientation:")THEN Backspace(11) Backspace(11) ELSE IF(LEN_TRIM(TXT)=="Standard orientation:") THEN REWIND(12) READ(11,*,IOSTAT=FIOS) READ(11,*,IOSTAT=FIOS) READ(11,*,IOSTAT=FIOS) READ(11,*,IOSTAT=FIOS) DO WHILE(.TRUE.) READ(11,"(A80)",IOSTAT=FIOS) TXT IF(TXT=="--------------------------------") EXIT READ(TXT,*,IOSTAT=FIOS) CN,AN,AT,X1,Y1,Z1 PRINT *, X1,Y1,Z1 WRITE(12,*) X1,Y1,Z1 END DO END IF END DO END DO STOP END 還請有看到的大大指點迷津 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 140.117.58.73 ※ 文章網址: http://www.ptt.cc/bbs/Fortran/M.1418059835.A.5A9.html

12/09 10:24, , 1F
讀取一次即可,並不需要用到backspace
12/09 10:24, 1F

12/09 10:24, , 2F
流程大概如下
12/09 10:24, 2F

12/09 10:25, , 3F
1. 一行行把檔案內容字串存成變數
12/09 10:25, 3F

12/09 10:26, , 4F
2. IF(內容=="orientation") 就把下面幾行座標存起來
12/09 10:26, 4F

12/09 10:27, , 5F
3.IF(內容=="completed") 就印出成功並顯示座標
12/09 10:27, 5F

12/09 10:30, , 6F
流程2即使前面會因為同樣的關鍵字而變數重複被覆蓋
12/09 10:30, 6F

12/09 10:31, , 7F
但能保證看到completed之前所讀取的資料一直是較新的
12/09 10:31, 7F
※ 編輯: kitsune128 (140.117.58.73), 12/10/2014 02:43:49

12/10 18:06, , 8F
TRIM(TXT)才對喔 LEN_TRIM是整數
12/10 18:06, 8F
文章代碼(AID): #1KXU0xMf (Fortran)
文章代碼(AID): #1KXU0xMf (Fortran)