2016-06-21 12 views
3

テキストファイルに書き込まれたテンソル要素を読み込もうとしています。ファイルの最初の行はテンソルの次元を定義します。次の行はテンソル値を与える。 Matlabの構文では、次のコード行でこれを実現できましたが、私はJuliaで同等の関数をコーディングするのが困難です。どんな助けでも大歓迎です。Juliaのデータを含むテキストファイルの行ごとの解析?

fid=fopen(fname); 
    shape = sscanf(fgetl(fid),'%i'); 
    for j = 1:shape(3) 
    for i = 1:shape(1) 
     A(i,:,j) = str2num(fgets(fid)); 
    end 
    end 
fclose(fid); 

一般的なファイルの最初の行を以下に再現されています

  4   4   48 
1.00000 0.00000 0.00000 0.00000 
0.00000 1.00000 0.00000 0.00000 
0.00000 0.00000 1.00000 0.00000 
0.00000 0.00000 0.00000 1.00000 
-1.00000 0.00000 0.00000 0.00000 
0.00000 1.00000 0.00000 0.00000 
0.00000 0.00000 -1.00000 0.00000 
0.00000 0.00000 0.00000 1.00000 
-1.00000 0.00000 0.00000 0.00000 
... 
+0

Matlabの構文に慣れていない人にとっては、コードに読みたいデータファイルの簡単な例を与えることができれば価値があります。 – Simon

+0

良いアイデア!ありがとう! – lenzinho

+2

なぜ、行ごとの解析を行う必要があるのか​​分かりません。提供されている例では、1行に同じ数の列があり、すべてのデータが数値なので、なぜ 'readdlm'だけできませんか? –

答えて

3

あなたが行で行を読みたいならば、あなたは次のように使用することができます。特に

a = open("/path/to/data.txt", "r") 
for line in eachline(a) 
    print(line) ## or whatever else you want to do with the line. 
end 
close(a) 

を、このような構文:

LineArray = split(replace(line, "\n", ""), "\t") 

はあなたに役に立つかもしれません。 (a)行末の改行を削除し、(b)索引配列に分割して、行内にある予測可能な位置に基づいて要素を抜き出すことができます。

また置くことができる:

Header = readline(a); 

をあなたは特別ヘッダを引き出し、その後、上記のループを実行したい場合は、ファイルを開いた直後。あるいは、enumerate()eachline(a)以上に使用して、列挙のインデックスに対して論理を実行することもできます(たとえば、インデックスが1のときにヘッダーを定義するなど)。

これはデイキャスターからの回答よりも遅くなるため、実際に余分な柔軟性が必要な場合にのみ価値があります。

5

@colinが彼のコメントで述べたように、このようなファイルは簡単にこれとジュリアに読み込むことができます。

julia> data, heading = readdlm("/tmp/data.txt", header=true) 
(
9x4 Array{Float64,2}: 
    1.0 0.0 0.0 0.0 
    0.0 1.0 0.0 0.0 
    0.0 0.0 1.0 0.0 
    0.0 0.0 0.0 1.0 
-1.0 0.0 0.0 0.0 
    0.0 1.0 0.0 0.0 
    0.0 0.0 -1.0 0.0 
    0.0 0.0 0.0 1.0 
-1.0 0.0 0.0 0.0, 

1x4 Array{AbstractString,2}: 
"4" "4" "48" "") 

返される2つの値は、Float64の配列で、ヘッダー行は文字列の配列です。

どのような用途ですか?

関連する問題