[心得] 字串比較的相等問題
這篇文的分享,其實是為了讓我以後再遇到,可以來爬文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
01/31 17:58, 1F
推
02/02 03:09,
4年前
, 2F
02/02 03:09, 2F
推
02/04 02:51,
4年前
, 3F
02/04 02:51, 3F
→
02/04 11:33,
4年前
, 4F
02/04 11:33, 4F
Fortran 近期熱門文章
PTT數位生活區 即時熱門文章