2016-06-21 18 views
3

我正在尝试读取张量元素写入文本文件。文件的第一行定义了张量维度。下一行给出张量值。在Matlab语法中,我能够通过下面的代码行来实现这一点,但是我在Julia编写等效函数时遇到了困难。任何帮助是极大的赞赏。正如@colin说,在他的评论,这样的文件可以很容易地读入朱莉娅与此Julia对包含数据的文本文件进行逐行解析?

  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

我不知道我明白你为什么需要逐行解析。在提供的示例中,每行的列数相同,并且所有数据都是数字,所以为什么不能只读'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); 

你打开文件之后,如果你想专门拔出头,然后运行上面的循环。或者,您可以在eachline(a)之上使用enumerate(),然后在枚举的索引上执行逻辑(例如,在索引= 1时定义标头)。

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

5

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

典型的文件的第一行转载如下

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

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

有什么用?

相关问题