julia で Microsoft Excel の xlsx 形式のファイルをダウンロードして dataframe で読み込む方法

わが国のお役所が大好きな xlsx 形式のファイルをダウンロードして、dataframe で読み込む方法です。

年度が代ったためか、CSV 形式でダウンロードができなくなったため、MS Excel のxlsx 形式で落してくる必要が生じました。 julia で xlsx 形式を扱う場合は、XLSX.jl を使うのが良さそうです。 残念ながら、XLSX.jl を使ってインタネット上のファイルをそのまま HTTP.get() で読めなかったため、HTTP.download() で保存してから読み込みます。

お役所のファイルは表題が A1 などに入って、さらに B2 以降などでセルが結合されて列名が階層化されていたりします。 XLSX.jl では、で丸ごと読んでくれますが、これを DataFrame にするには範囲の指定が必要です。 1回だけなら手書きでも良いですが、末尾のセル名が必要になるかもしれません。 XLSX.jl では、`[B3:end]` のような `end` 表記などは許してくれません。 正確なデータ範囲を知っている必要があります。 そこで、1回、xlsx ファイル全体を `[:]` で Matrix に変換してしまいましょう。 Matrix になっていれば、[3:end , 2:end] のように指定できるようになります。 恐らく、多くの DataFrames.jl 使いの方は、Matrix を挟む方が操作性が良いと考えます。

ダウンロード元と保存先、xlsx ファイルの構造などは下記のとおりとします。

  • downloadUrl : ダウンロードしたいファイルの url (string)
  • localOutputFileName : ローカルに保存したいファイル名のパス (string)
  • "Sheet1" : ダウンロードした xlsx ファイルの読み込みたいシートの名前
  • "Sheet1"の構造と読み込みたい範囲 : A1 に 表題があり、A4 から下最後まで、横は AからE の5列が読み込み対象


julia> using HTTP, XLSX , DataFrames

julia> HTTP.download( downloadUrl , localOutputFileName )

julia> xf = XLSX.readxlsx( localOutputFileName )["Sheet1"]

julia> matrixData = xf[:][4:end,1:6] # xf[:] で全体が Matrix になります

julia> df = DataFrame(matrixData, :auto) # 列名を指定しない場合は `:auto` が必要です


以上としたいところですが、これから、各列の欠損データやデータ形式の不統一性との格闘だったりします。(おわり)

B! LINE