parsing - 将关键字后面的数字从文本文件读取到 Fortran 90 中的数组中

标签 parsing file-io fortran fortran90

我有很多这种格式的文本文件

....
<snip>
'FOP' 0.19 1 24 1 25 7 8  /
'FOP' 0.18 1 24 1 25 9 11 /
/ 

TURX
560231
300244
70029
200250
645257
800191
900333
600334
770291
300335
220287
110262 /

SUBTRACT
'TURX' 'TURY'/
</snip>
......

我剪下的部分包含各种格式的其他各种数据。文件格式不一致(机器生成),唯一可以确定的是关键字TURX可能会出现多次。如果它单独出现在一行上,那么接下来的几行将包含我需要提取到数组中的数字。最后一个数字将有一个空格,然后是一个正斜杠 (/)。然后我可以在其他操作中使用这个数组。

如何在 Fortran 中“搜索”或解析未知格式的文件,以及如何获得循环来获取其余数据?我对此真的很陌生,我必须使用 fortran。谢谢。

最佳答案

Fortran 95/2003 有许多字符串和文件处理功能,使这变得更容易。

例如,处理未知长度文件的代码片段:

   use iso_fortran_env


  character (len=100) :: line
   integer :: ReadCode


ReadLoop: do
  read (75, '(A)', iostat=ReadCode )  line

  if ( ReadCode /= 0 ) then
     if ( ReadCode == iostat_end ) then
        exit ReadLoop
     else
        write ( *, '( / "Error reading file: ", I0 )' )  ReadCode
        stop
     end if
  end if

  ! code to process the line ....

end do ReadLoop

然后,“处理线路”代码可以包含多个部分,具体取决于逻辑变量“Have_TURX”。如果 Have_TRUX 为 false,则您正在“寻找”...测试该行是否包含“TURX”。如果 TURX 始终位于字符串的开头,则可以使用普通的“==”,或者为了更通用,您可以使用内部函数“index”来测试字符串“line”是否包含 TURX。

一旦程序处于 Have_TRUX 为 true 的模式,则可以使用“内部 I/O”从字符串中读取数值。由于整数具有不同的长度并且左对齐,最简单的方法是使用“列表定向 I/O”:组合这些:

read (line, *) integer_variable

然后您可以再次使用内部函数“index”来测试字符串是否也包含斜杠,在这种情况下,您将 Have_TRUX 更改为 false 并结束阅读模式。

如果您需要将数字放入数组中,则可能需要读取该文件两次,或者退格该文件,因为您必须分配该数组,并且在您知道该数组之前无法执行此操作数组的大小。或者,您可以将数字弹出到链接列表中,然后当您点击斜杠时分配数组并从链接列表中填充它。或者,如果存在已知的最大值数,则可以使用临时数组,然后将数字传输到可分配的输出数组。假设您希望子例程的输出参数是正确长度的可分配数组,并且每次调用返回一组数字:

integer, dimension (:), allocatable, intent (out) :: numbers
allocate (numbers (1: HowMany) )

附注http://en.wikipedia.org/wiki/Fortran_95_language_features 有语言功能的简要总结。 gfortran 手册有一个内部过程的摘要,从中您可以看到哪些内置函数可用于字符串处理。

关于parsing - 将关键字后面的数字从文本文件读取到 Fortran 90 中的数组中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6260009/

相关文章:

perl - 读取在 Perl 中可能被截断的文件

python - 使用变量python脚本打开文件

php - 如何将一个字符串放入PHP中的文本文件中?

fortran - 将 block 数据 F77 转换为 F90

java - 日期的 DateFormat 解析行为从 Java 8 更改为 Java 9,是否有任何相关的环境设置?

python - 如何解决无法将表名解析为 python sqlite 查询的问题?

linux - 使用 shell 脚本读取矩阵的所有条目

c# - 如何使用 CHARACTER * 50 类型的参数将参数从 C# 传递到 FORTRAN?

java - 如何解析以分隔符whitespace-tilde-whitespace "~ "开头的文本?

ios - 将数据从 TableViewController 传递到解析器