いまどきの固定長データはread_fwf()を用いて読み込む

こんな感じのデータがあったとする。

library(readr)
fwf_sample <- readr_example("fwf-sample.txt")
cat(read_lines(fwf_sample))
John Smith          WA        418-Y11-4111 Mary Hartford       CA        319-Z19-4341 Evan Nolan          IL        219-532-c301

いわゆる固定長データであり、バイト数を指定して読み込むことになる。 Rだともともとread.fwf()という関数が用意されている。 https://dichika.hateblo.jp/entry/20120406/1333683931

が、いちいちバイト数を指定するのは面倒である。とにかく楽をしたい。データの読み込みなんぞで力を使いたくない。 空白のカラムからよしなにバイト数を推定して読み込んで欲しい。 こういう時はreadrパッケージのread_fwf()を利用する。

# 空白のカラムからよしなにバイト数を指定してもらうパターン
read_fwf(fwf_sample, fwf_empty(fwf_sample, col_names = c("first", "last", "state", "ssn")))

もちろんバイト数を指定するパターンも利用できるし、色々な指定法がある。

# バイト数を指定するパターン
read_fwf(fwf_sample, fwf_widths(c(20, 10, 12), c("name", "state", "ssn")))
# 上記を各列名と紐づけて指定するパターン
read_fwf(fwf_sample, fwf_cols(name = 20, state = 10, ssn = 12))

# 開始位置と終了位置を指定するパターン
# この場合、nameの開始位置は1 終了位置は20、ssnの開始位置は30 終了位置は42
read_fwf(fwf_sample, fwf_positions(c(1, 30), c(20, 42), c("name", "ssn")))
# 上記を各列名と紐づけて指定するパターン
read_fwf(fwf_sample, fwf_cols(name = c(1, 20), ssn = c(30, 42)))

いかがでしたか?