我需要从以下输入文件中读取输入并初始化所有变量。
输入文件
A=1.0
B=1.0
C=2.0
我使用以下Julia
代码来阅读此内容。
# Read the delemited file
in = readdlm("inputFile.in",'=');
# Declare all the variables before initialising them with the data from input file.
A=0.0; B=0.0; C=0.0;
# Parsing
for i in 1:length(in[:,1])
if in[i,1] == "A"
A=in[i,2]
elseif in[i,1] == "B"
B=in[i,2]
elseif in[i,1] == "C"
C=in[i,2]
else
println(STDERR,in[i,1],"\tKeyword not recognised.")
exit()
end
end
此方法不可扩展到大量输入变量。正如您将注意到的,我想读取变量名称并将它们初始化为输入文件中给出的值。
这样做有更优雅/简短的方法吗?我想在数组中保存变量的名称,并使用for
循环从文件中读取它们。
感谢您的帮助。
答案 0 :(得分:4)
也许是这样的?
基本方法
我将从文件config.txt
中读取包含以下内容的值
A=1.0
B = 2.1
C= 3.3
D =4.4
我不想硬编码可能存在哪些变量,因此我将把所有变量保存在一个Dict中,如下所示:
julia> vars = Dict{String, Float64}()
Dict{String,Float64} with 0 entries
julia> f = open("config.txt")
IOStream(<file config.txt>)
julia> for line in eachline(f)
var, val = split(line, "=")
vars[strip(var)] = parse(Float64, val)
end
julia> vars
Dict{String,Float64} with 4 entries:
"B" => 2.1
"A" => 1.0
"C" => 3.3
"D" => 4.4
julia> vars["A"]
1.0
只读取一些变量
如果你想限制应该读取的变量集,那么它也很容易做到:
julia> vars = Dict{String, Float64}()
Dict{String,Float64} with 0 entries
julia> allowed = ["A", "B", "C"]
3-element Array{String,1}:
"A"
"B"
"C"
julia> f = open("config.txt")
IOStream(<file config.txt>)
julia> for line in eachline(f)
var, val = split(line, "=")
stripped = strip(var)
if stripped in allowed
vars[stripped] = parse(Float64, val)
end
end
julia> vars
Dict{String,Float64} with 3 entries:
"B" => 2.1
"A" => 1.0
"C" => 3.3
现在D=...
config.txt
被忽略,因为该名称不在allowed
中。
将变量作为变量,而不是Dict
另一种方法是:
function go(;A=0.0, B=0.0, C=0.0)
println("A = $A, B = $B, C = $C")
end
vars = Dict{Symbol, Float64}()
f = open("config.txt")
allowed = ["A", "B", "C"]
for line in eachline(f)
var, val = split(line, "=")
stripped = strip(var)
if stripped in allowed
vars[Symbol(stripped)] = parse(Float64, val)
end
end
go(;vars...)
使用相同的config.txt
打印
A = 1.0, B = 2.1, C = 3.3
答案 1 :(得分:1)
如果你想让你的变量在你拥有它们的文本文件中,那么这将很好地工作(它只是解析/ eval的每一行)。
inputfile = readlines("inputFile.in")
eval.(parse.(inputfile))
我刚刚意识到这不使用for循环,这是一个要求吗?如果是这样,那么这样的事情也会很好:
open("inputFile.in", "r") do f
for line in eachline(f)
eval(parse(line))
end
end
但是如果您不需要将变量保存在文本文件中,那么JLD包是最方便的选项&amp;将会更具规模。
using JLD
A=1.0
B=1.0
C=2.0
@save "myfirstsave.jld" A B C
@load "myfirstsave.jld"
答案 2 :(得分:1)
如果输入文件仅包含Julia代码,则可以包含它:
include("inputFile.in")
println("A", A)
根据您的工作流程,它可能比使用JLD更容易,因为您的输入文件仍然是一个人类可读的文本文件,而不是另一个文本文件生成的二进制文件。
主要的一点是你不能以编程方式引用输入变量集,例如:列出它们,检查存在等等......