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

len*_*nho 3 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);
Run Code Online (Sandbox Code Playgroud)

典型文件的第一行如下:

         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
...
Run Code Online (Sandbox Code Playgroud)

day*_*ter 6

正如@colin在他的评论中所说,这样的文件很容易被读入Julia:

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"  "")
Run Code Online (Sandbox Code Playgroud)

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

有用吗?


Mic*_*gge 5

如果您确实想逐行阅读,可以使用以下命令:

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)
Run Code Online (Sandbox Code Playgroud)

特别是,像这样的语法:

LineArray = split(replace(line, "\n", ""), "\t")
Run Code Online (Sandbox Code Playgroud)

可能对你有用。它将 (a) 删除行末尾的换行符,(b) 然后将其拆分为索引数组,以便您可以根据元素在行中占据的可预测位置将其从中取出。

您还可以输入:

Header = readline(a);
Run Code Online (Sandbox Code Playgroud)

如果您想专门提取文件头,则在打开文件后立即运行上述循环。或者,您可以使用enumerate()over eachline(a),然后对枚举的索引执行逻辑(例如,当索引 = 1 时定义标头)。

但请注意,这会比 Daycaster 的答案慢,因此只有当您确实需要额外的灵活性时才值得。