首页 > 解决方案 > 如何使用 Julia、Pluto.jl 和 PlutoUI.jl 的 FilePicker 元素读取上传的 CSV 文件

问题描述

我正在尝试使用 PlutoUI 库的 Filepicker 元素

md""" Upload a Comma Separated Values (.csv) file to use: $(@bind user_csv FilePicker()) """

允许用户上传 CSV 文件进行处理。不幸的是,没有检测到数据类型,数据被表示为一维 Int64 数组:

Dict("name"=>"mtg_binder.csv", "data"=>Int64[ 81 117 97 110 116 105 116 121 44 78 97 109 101 44 83 105 109 112 108 101 95 78 97 109 101 44 83 101 116 44 67 97 114 100 95 78 117 109 98 101 53 52 51 46 49 57 34 44 13 10], "type"=>"")

那么,如何将 Int64 数组处理/转换为可以推送到 Dataframe 中的东西?

我尝试过的一些事情:

如果我执行csv 文件保存成功,但如果没有在每行之间获取空行数据(不是什么大问题)和错误write(csv_path, user_csv["data"]),我就无法读回文件。我可以用于第二个问题,但是数据变成了炒鸡蛋,无法使用。CSV.File(open(read, csv_path)) |> DataFrame;ArgumentError: Symbol name may not contain \0normalizenames=true

我还尝试使用 StringEncodings 编码为 UTF-8 和 UTF-16,但没有运气——它仍然是炒鸡蛋。

帮助?

标签: dataframecsvfile-uploadjuliapluto.jl

解决方案


这适用于您的用例吗?

UInt8.(user_csv["data"]) |> IOBuffer |> CSV.File |> DataFrame

这通过将Int64s 转换为字节 ( UInt8) 来工作。从那里,可以将用户数据放入一个IOBuffer可以馈送到 CSV 解析器的文件中。

您发布的数据似乎已被截断,因此我无法对其进行测试。但是在组成数据(包括 UTF8 字符)上,这似乎适用于我的系统。这是冥王星以外的一个例子:

julia> d = [207,128,44,32,98,10,49,44,32,50,10]
11-element Array{Int64,1}:
 207
 128
  44
 ...

julia> using CSV, DataFrames

julia> UInt8.(d) |> IOBuffer |> CSV.File |> DataFrame
1×2 DataFrame
│ Row │ π     │  b    │
│     │ Int64 │ Int64 │
├─────┼───────┼───────┤
│ 1   │ 1     │ 2     │

推荐阅读