在Julia中打印具有可变间距的列

snd*_*snd 2 julia

我有一个文件test.dat:

A   1.00         11
AT  2.00         12
ARE 3.00         13
Run Code Online (Sandbox Code Playgroud)

如果我在第三列上执行某些操作并将其写入文件

x=readdlm("test.dat")    
x[:,3]=x[:,3]*2
writedlm("test2.dat",x)

A   1   22
AT  2   24
ARE 3   26
Run Code Online (Sandbox Code Playgroud)

反正有没有得到这个输出?

A   1.00         22
AT  2.00         24
ARE 3.00         26
Run Code Online (Sandbox Code Playgroud)

我理解如何在其他数据上使用@printf做类似的事情,但它不适用于数组.

waT*_*eim 5

格式化输出到REPL

@sprintf和循环可能就是你想要的

假设test.dat包含以下内容:

A 1 11
AT 2 12
ARE 3 13
Run Code Online (Sandbox Code Playgroud)

然后使用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
Run Code Online (Sandbox Code Playgroud)

到一个文件

点缀一点,@ ssff将输出到字符串而不是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);
Run Code Online (Sandbox Code Playgroud)

Julia 0.4简化

在Julia 0.4中,您可以在@printf中使用splatting

for i in 1:size(x,1) push!(s,@sprintf("%-3s %4.2f %10d",x[i,:]...)) end
Run Code Online (Sandbox Code Playgroud)

一个班轮

或者你可以使用地图,做到和理解更简洁,但不太可读的一个班轮

朱莉娅0.3

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

朱莉娅0.4

writedlm("test2.dat",map([x[i,:] for i in 1:size(x,1)]) do y @sprintf("%-3s %4.2f %10d",y...) end);
Run Code Online (Sandbox Code Playgroud)