簡體   English   中英

用逗號分割長度未知但子字符串格式已知的 Fortran 字符串?

[英]Split Fortran character string of unknown length but known substring format by commas?

我正在嘗試用逗號將輸入變量拆分為一些 Fortran 代碼。 該變量是一個字符串,其中包含可變數量的日期,但日期始終采用 DD-MMM-YYYY 格式。

這種字符串的一個例子:

04-DEC-2015,10-DEC-2015,23-DEC-2015,25-DEC-2015

它並不總是四個日期,但它始終是該格式的 11 個字符的日期。

我只是想在不同的行上打印這些日期; 當前代碼:

write(outfile,10) '     - ', TRIM(days)

印刷:

     -  04-DEC-2015,10-DEC-2015,23-DEC-2015,25-DEC-2015

我想寫一些打印出來的東西:

     -  '04-DEC-2015'
     -  '10-DEC-2015'
     -  '23-DEC-2015'
     -  '25-DEC-2015'

有沒有一種簡單的方法可以做到這一點(我對 Fortran 很陌生)? 我正在考慮計算字符串中的逗號數,加 1 以獲得日期數,並在循環中創建適合每個日期的CHARACTER(11)變量,一次從字符串中獲取 11 個字符(跳過逗號),並以我想要的格式打印該日期。 是不是太糾結了?

正如之前所建議的,從內部文件中以列表為導向的讀取將無需更多努力就可以處理逗號分割。 為了

character(11) :: split_days(MAX_DAYS)=''
ndays = ...
read(days,*) split_days(1:ndays)

為了工作,我們需要知道ndays的價值。 如果你對類似的東西感到滿意

ndays = (len_trim(days)+1)/12
ndays = INDEX(days,',',BACK=.TRUE)/12+1

或者

ndays = COUNT([(days(i:i),i=1,LEN_DAYS)].eq.',')+1

那么一切都很好。

或者,您可以有一個可分配的數組

character(11), allocatable :: split_days(:)
ndays = ...
allocate (split_days(ndays))
read(days,*) split_days

或者,您不需要閱讀內部文件(列表導向或其他方式),盡管如果我信任輸入數據的形式,我可能會這樣做。

do i=1,MAX_DAYS
  split_days(i)=days(12*(i-1)+1:)
  if (INDEX(days(12*i:),',').eq.0) exit
end do

列表導向讀取方法的另一種可能性是選擇大量讀取,如果失敗,則再次嘗試讀取更少。 這僅在更棘手的情況下才有意義。

最后,如果需要,您可以使用通常的數組縮小/增長技巧。


如果您只是在打印而不是存儲之后,那么上面的循環方法可以避免弄亂一個未知長度的數組:

do i=1,MAX_DAYS
  print '("     - ''",A11,"''")', days(12*(i-1)+1:)
  if (INDEX(days(12*i:),',').eq.0) exit
end do

使用內部讀取。

 character(len=47) :: in = '04-DEC-2015,10-DEC-2015,23-DEC-2015,25-DEC-2015'
 character(len=11) :: out(4)
 read(in,*)out

請注意,這是用逗號分隔的。 如果逗號之間的字符串多於或少於 11 個字符,它們將被截斷或填充空白。 另請注意,字符串中不能有空格,否則 read 也會在那里拆分。

您確實需要知道要閱讀多少。 如果你知道它們的長度都是 11,你可以做(len(in)+1)/12 ,或者使用index來計算逗號。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM