用逗号拆分未知长度但已知子字符串格式的 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(len=47) :: in = '04-DEC-2015,10-DEC-2015,23-DEC-2015,25-DEC-2015'
 character(len=11) :: out(4)
 read(in,*)out

注意这是用逗号分隔的。如果逗号之间的字符串多于或少于 11 个字符,它们将被截断或用空格填充。另请注意,字符串中不能有空格,否则读取也会在那里拆分。

您确实需要知道要阅读多少。如果你知道它们的长度都是 11,你可以做 (len(in)+1)/12 ,或者使用 index 来计算逗号。

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

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

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

最后,如果需要,您可以使用常用的数组 shrinking/growing 技巧。


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

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