julia-lang
2017-02-27 27 views 4 likes 
4

我需要從下面的輸入文件中讀取輸入並初始化所有變量。更容易的方法來讀取文件輸入

輸入文件

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循環從文件中讀取它們。

謝謝你的幫助。

回答

4

也許這樣嗎?

基本方法

我打算從包含文件中讀取config.txt值以下

A=1.0 
B = 2.1 
C= 3.3 
D =4.4 

我不想硬編碼可能是有什麼變數,所以我打算讓所有的人都在一個快譯通,是這樣的:

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沒有。

有變量作爲變量,而不是快譯通

還有一個辦法是:

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 
+0

謝謝。看起來很有趣。 – devendra

+0

我現在再添加一個方法。 – avysk

1

如果你想擁有你的變量在一個文本文件中有你的格式,那麼這將很好地工作(它只是解析/ eval的每一個線)。

inputfile = readlines("inputFile.in") 
eval.(parse.(inputfile)) 

我才意識到這不適合循環使用,是一個要求嗎?如果是的話這樣的事情也將是不錯的:

open("inputFile.in", "r") do f 
    for line in eachline(f) 
     eval(parse(line)) 
    end 
end 

但是,如果你並不需要保存的變量在一個文本文件中,則JLD包是最方便的選擇&將更加規模化能力。

using JLD 

A=1.0 
B=1.0 
C=2.0 

@save "myfirstsave.jld" A B C 
@load "myfirstsave.jld" 
+0

我並不特別需要'for'循環。我會用你的第一個方法。謝謝。 – devendra

1

如果輸入的文件只包含朱莉婭代碼,你可以包含它:

include("inputFile.in") 

println("A", A) 

根據您的工作流程,它可能比使用JLD更容易,因爲你的輸入文件仍然是一個單一的人可讀的文本文件,而不是由另一個文本文件生成的二進制文件。

主要的缺點是你不能以編程方式引用輸入變量集,例如,列出它們,檢查是否存在等...

相關問題