[心得] 字串比較的相等問題

看板Fortran作者 (Strance)時間4年前 (2020/01/31 17:00), 4年前編輯推噓2(202)
留言4則, 4人參與, 4年前最新討論串1/1
這篇文的分享,其實是為了讓我以後再遇到,可以來爬文XD 事情的發生,是我為了比較兩個"我認為應該要一樣的字串",但怎麼樣都判定不相等 是這樣的,我有一份資料檔案文件,它的結構是這樣: event.dat ---------------------------------------- Event 1 Element1 data1 data2 data3 . . . ElementN data1 data2 data3 . . . Event N Element1 data1 data2 data3 . . . ElementN data1 data2 data3 -------------------------------------------------- 而其有一個對照表,是我另外做的,像是對答案一樣的工作, 對照表的格式如下: teble.dat --------------------------------------- Element1 attribute1 attribute2 attribute3 Element2 attribute1 attribute2 attribute3 . . . ElementN attribute1 attribute2 attribute3 -------------------------------------------------- 我同時要讀取檔案的 ElementN ,並尋找對照檔案中 ElementN的attribute 於是我使用正常方式來分別讀取,如以下形式: open(11,file="event.dat",status="old") open(12,file="tabel.dat",status="old") read(11,'(a5)')ele1 do while (.ture.) read(12,'(a5)')ele2 if (trim(ele1) .eq. trim(ele2)) then ! ...資料處理程序... exit end if end do 這裡問題就發生了,在搜尋的過程中,ele1與ele2從來沒有相等的時候, 我便輸出幾個數值來看: write(*,*)trim(ele1),trim(ele2),(trim(ele1).eq.trim(ele2)) 結果為: ABC AAA F ABC ABB F ABC ABC F 這個問題讓我納悶很久(大概一天XD),為什麼明明看起來一樣,卻說不一樣。 後來看長度才發現 len(ele1)=5 len(ele2)=3,難怪判斷都是false。 問題在於trim沒有刪除開頭為空格的功能,只能刪除字串尾的空格。 這裡Element的名稱有規定,是最多5個字元,最小3個。 而兩個檔案在讀取的時候,對齊的方向不太一樣,一個靠左一個靠右。 造成取得的字串可能分別為: " ABC"、"ABC "。 trim的結果分別為:" ABC"、"ABC",因此造成怎麼樣都無法相等。 因此我把原本的code加入去除開頭空格的功能 read(11,'(a5)')ele1 if (scan(trim(ele1)," ",back=.true.) == 1) then read(ele1,'(1x,a4)')ele11 else if (scan(trim(ele1)," ",back=.true.) == 2) then read(ele1,'(2x,a3)')ele11 else read(ele1,'(a5)')ele11 end if 這才真正解決我的問題,順利使資料跟參考檔案的內容能對得起來。 至於為什麼會有前端空格的問題,是因為我再製作參考檔案的時候, 使用awk的格式化輸出,也利於fortran固定格式的讀取: awk '{printf "%5s %7.4f %8.4f %6.1f\n",$1,$2,$3,$4}' tabel0.dat > tabel.dat 因此會強制補滿五格,但是會補在前面= = 以上是我這次的心得,如果有更好的建議希望可以指導我一下XD -- [05/31/2012 23:59:11] 與 XXXXX 交談: st3336: ? XXXXX: 你好不好意思 XXXXX: 你好,不好意思打繞ˇ st3336: .. st3336: 我以為我被嗆了 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 140.115.20.47 (臺灣) ※ 文章網址: https://www.ptt.cc/bbs/Fortran/M.1580461256.A.104.html ※ 編輯: st3336 (140.115.20.47 臺灣), 01/31/2020 17:02:09

01/31 17:58, 4年前 , 1F
Fortran90以降有adjustl或adjustr,再搭配trim。
01/31 17:58, 1F

02/02 03:09, 4年前 , 2F
02/02 03:09, 2F

02/04 02:51, 4年前 , 3F
trim(adjustl(ele1)) 這樣就好
02/04 02:51, 3F

02/04 11:33, 4年前 , 4F
真的欸 這樣就行了 以後都通用這種好了
02/04 11:33, 4F
文章代碼(AID): #1UC-p844 (Fortran)
文章代碼(AID): #1UC-p844 (Fortran)