使用Julia逐行解析包含数据的文本文件?

时间:2016-06-21 03:50:38

标签: julia

我试图读取写入文本文件的张量元素。文件的第一行定义张量维度。下一行给出张量值。在Matlab语法中,我能够使用以下代码行来实现这一点,但是我在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
...

2 个答案:

答案 0 :(得分:6)

正如@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"  "")

返回的两个值是Float64s数组,标题行是字符串数组。

有用吗?

答案 1 :(得分: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),然后对枚举的索引执行逻辑(例如,当index = 1时定义标题)。

请注意,这比天轮的答案慢,所以如果你真的需要额外的灵活性,这是值得的。