我不想仅仅为了读取一个包含按列排列的数字数据的文件而在语言中进行大量的截取。在julia 1.1中有没有一种简单的方法可以做到这一点?令人惊讶的是,手册上没有这个简单的任务。在python中,人们会这样做:
def read2col(filename, length):
data = []
for line in open(filename,'r'):
for word in line.split():
data.append(word)
data = np.reshape(data,(length,2))
data = np.asarray(data, dtype=np.float64)
return data发布于 2019-12-19 04:47:11
(未测试)
function read2col(filename, len)
asfloat64(s) = try x = parse(Float64, s); return x catch; return missing; end
data = []
for word in split(read(filename, String), r"\s+")
push!(data, word)
end
data = reshape(data,(len, 2))
data = asfloat64.(data)
return data
end甚至是
asfloat64(s) = try x = parse(Float64, s); return x catch; return missing; end
read2col(fname, len) = asfloat64.(reshape(split(read(fname, String), r"\s+"), (len, 2)))发布于 2019-12-19 07:27:52
Julia中已经有一个内置的函数可以做到这一点:
using DelimitedFiles
reshape(readdlm("myfilename.txt"),:,2)让我们试一试:
shell> more file.txt
1 2 3
4 5 6
7 8 9
10 11 12
julia> reshape(readdlm("file.txt"),:,2)
6×2 Array{Float64,2}:
1.0 8.0
4.0 11.0
7.0 3.0
10.0 6.0
2.0 9.0
5.0 12.0或者,如果您想要不同的排序,只需使用'转置
julia> reshape(readdlm("file.txt")',:,2)
6×2 reshape(::LinearAlgebra.Adjoint{Float64,Array{Float64,2}}, 6, 2) with eltype Float64:
1.0 7.0
2.0 8.0
3.0 9.0
4.0 10.0
5.0 11.0
6.0 12.0发布于 2019-12-19 12:09:03
最懒惰的方法是使用CSV.jl
using CSV
for row in CSV.File("file.txt",delim=' ',ignorerepeated=true)
println("a=$(row.a), b=$(row.b), c=$(row.c)")
enddelim=',':一个字符或字符串,指示文件中列的分隔方式;如果未提供参数,解析将尝试在文件的前10行检测最一致的分隔符
https://stackoverflow.com/questions/59399168
复制相似问题