我有一个文件test.dat:
A 1.00 11
AT 2.00 12
ARE 3.00 13
如果我对第三列执行某些操作并将其写入文件
x=readdlm("test.dat")
x[:,3]=x[:,3]*2
writedlm("test2.dat",x)
A 1 22
AT 2 24
ARE 3 26
无论如何都要获得此输出?
A 1.00 22
AT 2.00 24
ARE 3.00 26
我理解如何在其他数据上使用@printf做类似的事情,但它不适用于数组。
答案 0 :(得分:5)
@sprintf ,循环可能就是你想要的
假设test.dat包含以下内容:
A 1 11
AT 2 12
ARE 3 13
然后使用julia @printf 宏,其行为类似于C printf ,以下内容看起来像您想要的假设您需要2个小数位,总共4个空格,以及专用于最后一列的10个空格。
julia> x=readdlm("test.dat");
julia> x[:,3]=x[:,3]*2;
julia> for i in 1:size(x,1) @printf("%-3s %4.2f %10d\n",x[i,1],x[i,2],x[i,3]) end
A 1.00 22
AT 2.00 24
ARE 3.00 26
点缀一点, @sprintf 将输出到字符串而不是 STDOUT 。您可以填充一个数组,然后编写整个 String 数组。
s = Array(String,0);
for i in 1:size(x,1) push!(s,@sprintf("%-3s %4.2f %10d",x[i,1],x[i,2],x[i,3])) end
writedlm("test2.dat",s);
在Julia 0.4中,您可以在 @printf
中使用splattingfor i in 1:size(x,1) push!(s,@sprintf("%-3s %4.2f %10d",x[i,:]...)) end
或者您可以使用地图和执行以及对更简洁但不太可读的内线的理解
writedlm("test2.dat",map([x[i,:] for i in 1:size(x,1)]) do y @sprintf("%-3s %4.2f %10d",y[1],y[2],y[3]) end);
writedlm("test2.dat",map([x[i,:] for i in 1:size(x,1)]) do y @sprintf("%-3s %4.2f %10d",y...) end);