拆分Fortran字符串,长度未知但是用逗号知道子串格式?

时间:2017-12-10 19:21:15

标签: string printing fortran comma

我试图用逗号将输入变量拆分为某些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个字符(跳过逗号),并以我想要的格式打印该日期。这太复杂了吗?

2 个答案:

答案 0 :(得分:4)

正如之前所建议的那样,内部文件的列表定向读取将处理逗号分割,而不需要更多努力。对于

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

答案 1 :(得分:3)

使用内部阅读。

 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来计算逗号。