我正在尝试用逗号将输入变量拆分为一些 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
关于string - 用逗号拆分未知长度但已知子字符串格式的 Fortran 字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47742535/