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

标签 string fortran

我正在尝试用逗号将输入变量拆分为一些 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/

相关文章:

c# - 获取替换次数

javascript - 为什么我的凯撒密码会跳过某些字符?

python - 定义字符串时出现关键错误,python

c - csc 中 spmv 的 openmp 并行化

gcc - Fortran 77 提示常见 block

makefile - 设计 makefile 来编译不同配置的程序

string - 将字符串转换为小写

c# - 如何找到两个字符串之间的差异?

linux - 在 Linux CentOS 6.5 版上安装 R3.1.1 时出现问题(检查 LDFLAGS 以获取 Fortran 库的路径)

在 Visual Studio 中将可变长度 c 字符串转换为 Fortran 字符串