Fortran 读取混合文本和数字

标签 fortran readfile fortran90

我正在使用 Fortran 90 读取包含以下格式数据的文件

number# 125 var1= 2 var2= 1 var3: 4
        .
        .
        .
        .
number# 234 var1= 3 var2= 5 var3: 1

我尝试了以下命令并且工作正常
read (2,*)  tempstr , my_param(1), tempstr , my_param(2), tempstr , my_param(3)

问题是当数字变大并且字符串和数字之间没有空格时,即数据如下所示:
number# 125 var1= 2 var2=124 var3: 4

我试过
     read (2,512)  my_param(1), my_param(2), my_param(3)

512 format('number#', i, 'var1=', i, 'var2=', i, 'var3:', i)

它读取所有数字为零

我无法切换到其他语言。数据集很大,所以我无法对其进行预处理。此外,分隔符每次都不相同。
有人可以帮忙解决这个问题吗?

提前致谢

最佳答案

首先,72万行对于预处理来说并不算多。类似工具 sedawk主要是逐行工作,因此它们的扩展性非常好。

我实际上所做的是以可以使用名称列表的方式转换数据:

$ cat preprocess.sed

# Add commas between values
# Space followed by letter -> insert comma
s/ \([[:alpha:]]\)/ , \1/g

# "number" is a key word in Fortran, so replace it with num
s/number/num/g

# Replace all possible data delimitors with the equals character
s/[#:]/=/g

# add the '&mydata' namelist descriptor to the beginning
s/^/\&mydata /1

# add the namelist closing "/" character to the end of the line:
s,$,/,1

$ sed -f preprocess.sed < data.dat > data.nml

检查数据是否正确预处理:
$ tail -3 data.dat
number#1997 var1=114 var2=130 var3:127
number#1998 var1=164 var2=192 var3: 86
number#1999 var1=101 var2= 48 var3:120

$ tail -3 data.nml
&mydata num=1997 , var1=114 , var2=130 , var3=127/
&mydata num=1998 , var1=164 , var2=192 , var3= 86/
&mydata num=1999 , var1=101 , var2= 48 , var3=120/

然后你可以用这个fortran程序阅读它:
program read_mixed
    implicit none
    integer :: num, var1, var2, var3
    integer :: io_stat
    namelist /mydata/ num, var1, var2, var3

    open(unit=100, file='data.nml', status='old', action='read')
    do
        read(100, nml=mydata, iostat=io_stat)
        if (io_stat /= 0) exit
        print *, num, var1, var2, var3
    end do
    close(100)
end program read_mixed

关于Fortran 读取混合文本和数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38133083/

相关文章:

java - 如何找到file.txt的最大和最小数字?

compiler-errors - 模块和旧版 Fortran 77 代码

fortran - 本地初始化变量规则也适用于指针吗?

fortran - 在 gfortran 中预处理 !DEC$ 指令

javascript - Javascript fs.readFileSync 返回什么编码?

c++ - 在 Windows 中使用 ReadFile() 函数读取二进制数据

io - Fortran:如何从文件读取数组

linux - 程序收到信号SIGSEGV : Segmentation fault - invalid memory reference

algorithm - 网格前 10 个值的坐标

fortran - Fortran 90 中的标准输入和输出单位?