将 CSV 读入数组

问题描述 投票:0回答:4

在 Julia 中,使用

CSV.jl
,可以从
.csv
文件读取 DataFrame:

using CSV

df = CSV.read("data.csv", delim=",")

但是,如何将 CSV 文件读入

Vector{Float64}
数据类型?

csv julia
4个回答
14
投票

您可以使用 stdlib 中的

DelimitedFiles
模块:

julia> using DelimitedFiles

julia> s = """
       1,2,3
       4,5,6
       7,8,9"""
"1,2,3\n4,5,6\n7,8,9"

julia> b = IOBuffer(s)
IOBuffer(data=UInt8[...], readable=true, writable=false, seekable=true, append=false, size=17, maxsize=Inf, ptr=1, mark=-1)

julia> readdlm(b, ',', Float64)
3×3 Array{Float64,2}:
 1.0  2.0  3.0
 4.0  5.0  6.0
 7.0  8.0  9.0

我向您展示了从

IOBuffer
读取的示例,以便完全可重现,但您也可以从文件中读取数据。在
readdlm
的文档字符串中,您可以找到有关可用选项的更多详细信息。

请注意,您会得到

Matrix{Float64}
而不是
Vector{Float64}
,但我明白这就是您想要的。如果不是,那么为了将矩阵转换为向量,您可以在读取数据后调用
vec
函数。

编辑

这是使用 CSV.jl 读回

Matrix
的方法:

julia> df = DataFrame(rand(2,3))
2×3 DataFrame
│ Row │ x1        │ x2       │ x3       │
│     │ Float64   │ Float64  │ Float64  │
├─────┼───────────┼──────────┼──────────┤
│ 1   │ 0.0444818 │ 0.570981 │ 0.608709 │
│ 2   │ 0.47577   │ 0.675344 │ 0.500577 │

julia> CSV.write("test.csv", df)
"test.csv"

julia> CSV.File("test.csv") |> Tables.matrix
2×3 Array{Float64,2}:
 0.0444818  0.570981  0.608709
 0.47577    0.675344  0.500577

4
投票

您可以将您的

DataFrame
转换为某种类型的
Matrix
。如果没有丢失数据,这应该可以工作。如果缺少数据,只需省略
convert
中的类型即可。

arr = convert(Matrix{Float64}, df)

如果这确实是您想要的,您可以对结果调用

vec
来获取向量。

根据文件的不同,我会按照之前答案中的建议使用

readdlm


3
投票

总结博古米尔的答案,您可以使用:

using DelimitedFiles
data = readdlm("data.csv", ',', Float64)

0
投票

您可以直接要求

CSV.read
一次性使用
Matrix
作为目的地:

julia> import CSV

julia> s = """
       1,2,3
       4,5,6
       7,8,9""";

julia> CSV.read(IOBuffer(s), CSV.Tables.matrix; header=false)
3×3 Matrix{Int64}:
 1  2  3
 4  5  6
 7  8  9

请注意,存在一个当前未解决的问题,即使用内置的

Matrix
类型本身作为“接收器”,这将使此问题更容易被发现。

© www.soinside.com 2019 - 2024. All rights reserved.