如何使用 Julia,Pluto.jl & PlutoUI.jl 的 FilePicker 元素读取上传的 CSV 文件

How to read an uploaded CSV file using Julia, Pluto.jl & PlutoUI.jl's FilePicker element

我正在尝试使用 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 数组 handle/convert 转换成可以推入 Dataframe 的内容?

我尝试过的一些事情:

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

我也尝试过使用 StringEncodings 编码为 UTF-8 和 UTF-16,但没有成功——它仍然是炒鸡蛋。

帮忙?

这适用于您的用例吗?

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

这通过将 Int64s 转换为字节 (UInt8) 来实现。从那里,用户数据可以放入 IOBuffer 中,可以提供给 CSV 解析器。

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

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     │

您也可以使用 TableIO。 以下适用于多种表格文件格式,包括 CSV:(所有行在 Pluto 中都是单独的单元格):

using PlutoUI, TableIO, DataFrames

@bind f PlutoUI.FilePicker() # pick any supported file type

df = DataFrame(read_table(f); copycols=false)