固定幅ファイルの処理とデータ分割を簡単にする方法

固定幅ファイルとの格闘録~仕様書解読から文字化け地獄まで

固定長さファイル、いやぁ…日常ではほとんど見かけない存在なんだけど、いざ手元に現れると地味に厄介だったりする。うーん、区切り記号が全く無いせいで、ときには全部のカラム情報が一つの莫大な文字列として詰め込まれているケースも珍しくない。あれ?二百以上あるはずなのに、一列しか認識できなくて、「え、この連なった数字や文字列、本当に何?」みたいな謎状態になったこともあった。実際、ヘッダーすら付いてこないパターンも経験したし、その時点で人間の眼力頼みになってしまう気配を感じた瞬間がある。

まあでも、もし運良くどこかからカラム名と位置情報(つまり開始位置とか終了位置とか幅とか)が記されたリストを発掘できたなら…まだギリギリ希望は捨てなくてもいいっぽい。実は「readr」パッケージ内のread_fwf()関数が役立つ場面だったような気がしてる。でも細部となると曖昧だし、自分の場合、おそらくExcelか何かで事前に各カラムの幅を一覧表として作成しておいて、それをvector形式で読み込ませる流れだったと思う、多分。

なんというか完璧じゃなくてもね、とりあえずこの方法使えばデータ自体は何となく解体できそうだった印象…。ま、いいか。ただ自動化とは程遠い上に失敗も案外多発するし、大量カラムのFWF相手だと他に選択肢思いつかなかった感じかな。ふと今考えてみても、結局これくらいしか試せる策が残らなかった気がするよ、本当に疲れるやつだわ…。

本段の参照元: https://www.johnmackintosh.net/blog/2021-10-05-fwf/

ツール論争より深刻な日本特有の罔市仕様との戦い

FWF形式のファイルって、解析するときカラム名やフィールド幅とかを事前にリスト化しておくと、作業がぐっと楽になるんだよね。まあ、みんな一度はExcelで全カラムの位置と幅を表にまとめたことあるんじゃない?あれって意外と面倒だけど…。でも、それをRのベクトルっぽい形式に変換して `read_fwf()` に渡しちゃえばいい。えーと、「col_positions = fwf_widths(c(8,10,12), col_names = c("ID","日付","取引内容"))」みたいな感じで記述することになるわけ。

……ただ、ここでつまずく人も多いんだよな。カラム数が七十以上もあったりしたら、そもそも幅指定のミスとか順番間違いが発生しやすいし――ま、そのへん私もしょっちゅうやらかすんだけど。で、結局読み込んだ後になって「うわ、中身ズレてるじゃん!」って気づいたりすることが珍しくない。それこそ、一瞬ほかの作業に気を取られて設定ミス…いや、いやいや、本筋戻ろう。

正しい運用例ではね、必ず幅情報とヘッダー対応表を2回くらい見直してから読み込むべきなんだ。でもさ、一括指定とかコピー&ペースト一発勝負で設定しちゃうクセがついてると、不意打ちみたいなデータ結合エラーになりかねない。実際それで痛い目見た人も多そう…。ま、とりあえず確認は怠るべきじゃないよ。本当に。

ツール論争より深刻な日本特有の罔市仕様との戦い

Related to this topic:

Comments