更轻松地从文件中读取输入

时间:2017-02-27 09:13:45

标签: julia

我需要从以下输入文件中读取输入并初始化所有变量。

输入文件

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循环从文件中读取它们。

感谢您的帮助。

3 个答案:

答案 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更容易,因为您的输入文件仍然是一个人类可读的文本文件,而不是另一个文本文件生成的二进制文件。

主要的一点是你不能以编程方式引用输入变量集,例如:列出它们,检查存在等等......