如何在 Julia 中以特定格式保存数组或矩阵?

How to save array or matrix in Julia with specific format?

我试过使用 Julia,我对保存数据时固定浮点数和小数点的长度有一些疑问。

输入文件名为“L100_A100_C100.dat”,数据如下:

SIMULATION RESULTS
 0.599566E+00 0.666925E-06   0.3348E+02   0.2527E+03  -0.6948E+04  
 0.599633E+00 0.666924E-06   0.3394E+02   0.2529E+03  -0.6949E+04  
 0.599699E+00 0.666922E-06   0.3424E+02   0.2528E+03  -0.6949E+04  
 0.599766E+00 0.666920E-06   0.3440E+02   0.2527E+03  -0.6949E+04  
 0.599833E+00 0.666919E-06   0.3460E+02   0.2525E+03  -0.6948E+04  
 0.599899E+00 0.666919E-06   0.3488E+02   0.2522E+03  -0.6948E+04  
 0.599966E+00 0.666919E-06   0.3530E+02   0.2520E+03  -0.6948E+04  

所以我编程如下:

file = open("L100_A100_C100.dat", "r")
data = readdlm(file, Float64, skipstart=1)
writedlm("output.txt", data)

并且输出是

0.599566    6.66925e-7  33.48   252.7   -6948.0
0.599633    6.66924e-7  33.94   252.9   -6949.0
0.599699    6.66922e-7  34.24   252.8   -6949.0
0.599766    6.6692e-7   34.4    252.7   -6949.0
0.599833    6.66919e-7  34.6    252.5   -6948.0
0.599899    6.66919e-7  34.88   252.2   -6948.0
0.599966    6.66919e-7  35.3    252.0   -6948.0

但我的问题是如何确定浮点数和小数点的长度(就像 Python 中的 '%10.3f')?

在 Julia 中,printf 可用作 macro。 Julia 宏是一段 Julia 代码,它在编译时生成其他 Julia 代码。在这种情况下,在编译时,宏 @sprintf 生成一个格式化对象(这也验证了格式化字符串)和格式化代码。稍后,在运行时,执行实际的格式化。

因此你可以这样做:

julia> x = rand(2,3)
2×3 Matrix{Float64}:
 0.475864  0.285398  0.969636
 0.46037   0.708167  0.45792

julia> using Printf

julia> m = (a->(@sprintf "%10.3f" a)).(x)
2×3 Matrix{String}:
 "     0.476"  "     0.285"  "     0.970"
 "     0.460"  "     0.708"  "     0.458"

现在你有一个直接转储到文件的预格式化文本矩阵(我使用 stdout 代替):

julia> writedlm(stdout, m, "" , quotes=false)
     0.476     0.285     0.970
     0.460     0.708     0.458