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

C. *_*Pat 2 string fortran

我试图用逗号将输入变量拆分为某些 Fortran 代码。该变量是包含可变数量日期的字符串,但日期始终采用 DD-MMM-YYYY 格式。

此类字符串的示例:

04-DEC-2015,10-DEC-2015,23-DEC-2015,25-DEC-2015
Run Code Online (Sandbox Code Playgroud)

它并不总是四个日期,但始终是该格式的 11 个字符的日期。

我只是想将这些日期打印在单独的行上;当前代码:

write(outfile,10) '     - ', TRIM(days)
Run Code Online (Sandbox Code Playgroud)

印刷:

     -  04-DEC-2015,10-DEC-2015,23-DEC-2015,25-DEC-2015
Run Code Online (Sandbox Code Playgroud)

我想写一些打印的东西:

     -  '04-DEC-2015'
     -  '10-DEC-2015'
     -  '23-DEC-2015'
     -  '25-DEC-2015'
Run Code Online (Sandbox Code Playgroud)

有没有一种简单的方法可以做到这一点(我对 Fortran 还很陌生)?我正在考虑计算字符串中逗号的数量,加 1 以获取日期数量,并在循环内创建一个CHARACTER(11)适合每个日期的变量,一次从字符串中获取 11 个字符(跳过逗号),然后打印我想要的格式的日期。这也太复杂了吧?

fra*_*lus 6

正如之前所建议的,从内部文件进行列表定向读取将无需更多努力即可处理逗号分割。为了

character(11) :: split_days(MAX_DAYS)=''
ndays = ...
read(days,*) split_days(1:ndays)
Run Code Online (Sandbox Code Playgroud)

为了工作,我们需要知道 的价值ndays。如果你对类似的事情感到满意

ndays = (len_trim(days)+1)/12
ndays = INDEX(days,',',BACK=.TRUE)/12+1
Run Code Online (Sandbox Code Playgroud)

或者

ndays = COUNT([(days(i:i),i=1,LEN_DAYS)].eq.',')+1
Run Code Online (Sandbox Code Playgroud)

那么一切都很好。

或者,您可以有一个可分配的数组

character(11), allocatable :: split_days(:)
ndays = ...
allocate (split_days(ndays))
read(days,*) split_days
Run Code Online (Sandbox Code Playgroud)

或者,您不需要读取内部文件(列表导向或其他方式),尽管如果我信任输入数据的形式,我可能会这样做。

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

列表定向读取方法的另一种可能性是选择大量读取,如果失败,则再次尝试读取更少的数据。这仅在更棘手的情况下才有意义。

最后,如果需要,您可以使用常用的数组缩小/增长技巧。


如果您只是在打印之后而不是存储之后,那么上面的循环方法可以避免弄乱未知长度的数组:

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