我正在尝试学习 Julia,但在将数据从 csv 导入 Jupyter 笔记本时遇到问题。这看起来很基本,我确信我错过了一些简单的东西,但我一直无法找到有效的解决方案。
当我运行导入脚本时:
using DelimitedFiles
println("Download from https://en.wikipedia.org/wiki/West_African_Ebola_virus_epidemic_timeline_of_reported_cases_and_deaths")
println("Downloaded and saved to csv on 6-25-2020")
wikiEVDraw = DelimitedFiles.readdlm("wikipediaEVDraw.csv", ',', header = true)
# Download from https://en.wikipedia.org/wiki/West_African_Ebola_virus_epidemic_timeline_of_reported_cases_and_deaths
# Downloaded and saved to csv on 6-25-2020
# (Any["25-Nov-15" "28,637" … "14,122" "3,955"; "18-Nov-15" "28,634" … "14,122" "3,955"; … ; "31-Mar-14" # 130 … "–" "–"; "22-Mar-14" 49 … "–" "–"],
# AbstractString["\ufeffDate" "Total_cases" … "Sierra Leone_Cases" "Sierra Leon_Deaths"])
我的问题是第一个位置的前导字符(“\ufeff”)。作为解决方法,我可以在外部程序中编辑源 csv 以添加额外的行,然后使用 skipstart = 1
跳过第一行我已尝试根据其他地方的建议指定编码,但是添加 encoding = :utf8
引发错误。
我想我也可以拆分第一个 header 中的字符串,但这似乎应该是标准的。
该 csv 是通过将数据从 Web 表复制到 Excel,然后另存为 csv 来创建的。我在其他几个程序(R、记事本、Atom、 Notepad++ )中查看过该文件,但没有看到主角。
最佳答案
这是BOM(字节顺序标记)的第一个字节,表示字符编码。 \ufeff
在此表示 UTF-16 有关更多详细信息,请参阅 https://en.wikipedia.org/wiki/Byte_order_mark#UTF-16
阅读文件时您应该跳过它。
但是,CSV.jl
会自动执行此操作:
shell> more "C:\temp\f.txt"
a b
1 2
3 4
julia> CSV.read(raw"C:\temp\f.txt")
2×2 DataFrame
│ Row │ a │ b │
│ │ Int64 │ Int64 │
├─────┼───────┼───────┤
│ 1 │ 1 │ 2 │
│ 2 │ 3 │ 4 │
如果您想继续使用DelimitedFiles
,只需跳过前三个字节:
julia> open(raw"C:\temp\f.txt") do io
read(io,3)
readdlm(io)
end
3×2 Array{Any,2}:
"a" "b"
1 2
3 4
在某些情况下,您实际上会有 UTF-16 编码的字符,在这种情况下您需要解码:
julia> using StringEncodings
julia> open(raw"C:\temp\f2.txt", enc"UTF-16") do io
readdlm(io)
end
3×2 Array{Any,2}:
"a" "b"
1 2
3 4
关于csv - 导入 csv 在 Jupyter 笔记本中的初始位置 Julia 中返回编码标识符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62597590/