我正在尝试学习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抛出了错误。
我想我也可以拆分第一个头中的字符串,但这似乎应该是标准的。
csv是通过将数据从web表复制到Excel,然后另存为csv来创建的。我已经在其他几个程序(R、notepad、Atom、notepad++)中查看了该文件,但没有看到前导字符。
发布于 2020-06-27 00:09:30
这是一个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     4https://stackoverflow.com/questions/62597590
复制相似问题