2017-02-27 1 views
4

Ich muss die Eingabe aus der folgenden Eingabedatei lesen und alle Variablen initialisieren.Einfachere Möglichkeit, Eingaben von einer Datei zu lesen

Eingabedatei

A=1.0 
B=1.0 
C=2.0 

Ich verwende folgende Julia Code, dies zu lesen.

# 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 

Diese Methode ist nicht skalierbar zu große Anzahl von Eingangsvariablen. Wie Sie sehen werden, möchte ich die Variablennamen lesen und sie auf den in der Eingabedatei angegebenen Wert initialisieren.

Gibt es eine elegantere/kürzere Möglichkeit, dies zu tun? Ich möchte die Namen der Variablen in einem Array speichern und verwenden Sie eine for-Schleife, um sie aus der Datei zu lesen.

Vielen Dank für Ihre Hilfe.

Antwort

4

Vielleicht so?

Grund Ansatz

Ich werde Werte aus der Datei config.txt lesen, enthält die folgende

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

Ich möchte es nicht hart codieren, welche Variablen sein könnte, also werde ich alle von ihnen in einem Dict, wie diese zu halten:

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 

nur s Lese ome Variablen

Wenn Sie den Satz von Variablen zu begrenzen, die gelesen werden sollen, ist es einfach auch tun:

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 

Jetzt D=... von config.txt ignoriert wird, wie der Name nicht in allowed war.

Variablen als Variablen zu haben, nicht als Dict

Ein weiterer Ansatz wäre:

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...) 

Laufen diese mit den gleichen config.txt druckt

A = 1.0, B = 2.1, C = 3.3 
+0

Danke. Sieht interessant aus. – devendra

+0

Ich füge jetzt einen weiteren Ansatz hinzu. – avysk

1

Wenn Sie haben wollen Ihre Variablen in einer Textdatei in dem Format, in dem Sie sie haben, dann wird dies gut funktionieren (es ist nur parse/eval jeder Linie).

Ich habe gerade festgestellt, dass dies keine For-Schleife verwendet, ist das eine Anforderung?wenn ja, dann so etwas wie dies wäre auch gut:

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

Aber wenn Sie brauchen nicht Ihre Variablen in einer Textdatei speichern dann das JLD-Paket ist die bequemste Option & wird viel mehr Scale-fähig .

using JLD 

A=1.0 
B=1.0 
C=2.0 

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

Ich brauche keine 'for' Schleife. Ich werde mit deiner ersten Annäherung gehen. Vielen Dank. – devendra

1

Wenn die Eingabedatei nur Julia Code enthält, können Sie es einfach sind:

include("inputFile.in") 

println("A", A) 

auf Ihren Workflow Abhängig kann es einfacher sein, als JLD verwenden, da die Eingabedatei ein einzelner Mensch bleibt lesbare Textdatei statt einer Binärdatei, die von einer anderen Textdatei generiert wird.

Die Hauptsache ist, dass Sie nicht programmgesteuert auf den Satz von Eingabevariablen verweisen können, z. liste sie auf, überprüfe auf Existenz, etc ...

Verwandte Themen