При импорте текстового CSV-файла в zip-файл из ftp url возникает связанная ошибка (BoundsError) - PullRequest
2 голосов
/ 05 января 2020
using HTTP, ZipFile, CSV
datafile="ftp://ftp.cdc.gov/pub/Health_Statistics/NCHS/Datasets/DVS/natality/Nat2018ps.zip"

function rzip(datafile)
    dat = HTTP.get(datafile)
    r = ZipFile.Reader(IOBuffer(dat.body))
    f  = r.files[1]
    CSV.read(f, delim=' ', ignorerepeated=true) 
end

Функция rzip читает zipfile и txt файл внутри него, использует CSV для создания фрейма данных и затем считывает его в таблицу.

При запуске выдается следующая ошибка:

julia> rzip(datafile)
ERROR: BoundsError: attempt to access 16-element Array{UInt64,1} at index [-9223372036854775807]

1 Ответ

2 голосов
/ 05 января 2020

Поток ZipFile.Reader не является потоком произвольного доступа, поэтому он не работает правильно в многопоточном режиме, недавно представленном в CSV.jl Следовательно, вам необходимо использовать параметр threaded=false.

using HTTP, ZipFile, CSV
datafile="ftp://ftp.cdc.gov/pub/Health_Statistics/NCHS/Datasets/DVS/natality/Nat2018ps.zip"
dat = HTTP.get(datafile)
r = ZipFile.Reader(IOBuffer(dat.body))
f  = r.files[1]
df = CSV.read(f, delim=' ', ignorerepeated=true, threaded=false) 

Теперь просто показать, что это работает:

julia> df
25918×56 DataFrames.DataFrame. Omitted printing of 51 columns  
│ Row   │ 201801 │ 04272GU │ 010311 │ 1     │ 20083US │
│       │ Int64  │ String  │ Int64  │ Int64 │ String  │
├───────┼────────┼─────────┼────────┼───────┼─────────┤
│ 1     │ 201801 │ 05592GU │ 10311  │ 1     │ 35116FM │
│ 2     │ 201801 │ 11362GU │ 10311  │ 1     │ 22083US │        
⋮
│ 25916 │ 201808 │ 01001PR │ 31371  │ 2     │ 22083US │        
│ 25917 │ 201811 │ 00495PR │ 21311  │ 1     │ 19072US │        
│ 25918 │ 201806 │ 10221PR │ 127211 │ 1     │ 19072US │
...