Io 在julia中读取列文件

Io 在julia中读取列文件,io,julia,Io,Julia,我不想为了读取一个包含按列排列的数字数据的文件而在语言中大量使用pickeaxe。现在在julia 1.1中有没有一种简单的方法可以做到这一点?令人惊讶的是,手册上没有这个简单的任务。在python中,可以执行以下操作: def read2col(filename, length): data = [] for line in open(filename,'r'): for word in line.split(): data.append

我不想为了读取一个包含按列排列的数字数据的文件而在语言中大量使用pickeaxe。现在在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
(未经测试)

甚至

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)))
(未经测试)

甚至

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

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

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

最懒惰的方法是使用CSV.jl

using CSV
for row in CSV.File("file.txt",delim=' ',ignorerepeated=true)
  println("a=$(row.a), b=$(row.b), c=$(row.c)")
end

delim=',':一个字符或字符串,指示文件中列的分隔方式;如果没有提供参数,解析将尝试在文件的前10行检测最一致的分隔符

最慢的方法是使用CSV.jl

using CSV
for row in CSV.File("file.txt",delim=' ',ignorerepeated=true)
  println("a=$(row.a), b=$(row.b), c=$(row.c)")
end

delim=',':一个字符或字符串,指示文件中列的分隔方式;如果没有提供参数,解析将尝试在文件的前10行检测最一致的分隔符

,感谢您的响应。我还没有尝试最后一个建议,但第一个建议几乎就要出现了,只需删除最后一个字符
data[end]=“
。您可以使用trim(read(fname,String))来修剪文件,以去掉尾随的空行。DelimitedFiles解决方案可以很好地处理尾随的空行,但如果其中一个条目是非数字的,则会崩溃。您可能还需要决定如果条目数量不均匀该怎么办,因为这也会使函数崩溃。谢谢您的回复。我还没有尝试最后一个建议,但第一个建议几乎就要出现了,只需删除最后一个字符
data[end]=“
。您可以使用trim(read(fname,String))来修剪文件,以去掉尾随的空行。DelimitedFiles解决方案可以很好地处理尾随的空行,但如果其中一个条目是非数字的,则会崩溃。如果条目数量不均匀,您可能还需要决定该怎么做,因为这也会使函数崩溃。