はじめに
3月もあと10日ほどで終わりですね。
本日は、COBOLの時代からひっそりと伝わる固定長ファイル分割術を、記憶が薄れる前にここに書き留めておこうという趣旨の記事です。
で、Linux環境だったら伝家の宝刀ddコマンドを駆使するわけですが、Windows環境となるとそのような手軽なツールは準備されていませんね。ということで、テキストエディタでグリッとこなす技を記載します。
分割ってどういうこと?
こんな感じの一行ファイルを、
1HHHHHHHHHHHHHHHHHHHHHHHHHHHHH21DDDDDDDDDDDDDDDDDDDDDDDDDDDD22DDDDDDDDDDDDDDDDDDDDDDDDDDDD23DDDDDDDDDDDDDDDDDDDDDDDDDDDD24DDDDDDDDDDDDDDDDDDDDDDDDDDDD25DDDDDDDDDDDDDDDDDDDDDDDDDDDD26DDDDDDDDDDDDDDDDDDDDDDDDDDDD27DDDDDDDDDDDDDDDDDDDDDDDDDDDD28DDDDDDDDDDDDDDDDDDDDDDDDDDDD29DDDDDDDDDDDDDDDDDDDDDDDDDDDD8TTTTTTTTTTTTTTTTTTTTTTTTTTTTT9EEEEEEEEEEEEEEEEEEEEEEEEEEEEE
このように区切ることを、
1HHHHHHHHHHHHHHHHHHHHHHHHHHHHH 21DDDDDDDDDDDDDDDDDDDDDDDDDDDD 22DDDDDDDDDDDDDDDDDDDDDDDDDDDD 23DDDDDDDDDDDDDDDDDDDDDDDDDDDD 24DDDDDDDDDDDDDDDDDDDDDDDDDDDD 25DDDDDDDDDDDDDDDDDDDDDDDDDDDD 26DDDDDDDDDDDDDDDDDDDDDDDDDDDD 27DDDDDDDDDDDDDDDDDDDDDDDDDDDD 28DDDDDDDDDDDDDDDDDDDDDDDDDDDD 29DDDDDDDDDDDDDDDDDDDDDDDDDDDD 8TTTTTTTTTTTTTTTTTTTTTTTTTTTTT 9EEEEEEEEEEEEEEEEEEEEEEEEEEEEE
分割と称することにします。
想定するデータの形式
ありがちな、
- ヘッダレコード
- データレコード
- トレーラレコード
- エンドレコード
の全銀フォーマット的な形式とします。何がありがちなのかよくわからな人は全銀フォーマット 固定長でggってください。
文字種は半角アルファベット・半角数字、ファイルに改行は含まれず、各レコードは30byteとします。
やりかた
ヘッダ→エンド→トレイラー→データの順に分割します。
ヘッダレコード
ヘッダレコードはファイルの先頭に陣取るレコードなので、
^.{30}
と正規表現を使って検索すれば、頭30byteが取得できます。
エンドレコード
エンドレコードはファイルの末尾に陣取るレコードなので、
.{30}$
と正規表現を使って検索すれば、お尻30byteが取得できます。
トレイラーレコード
エンドレコードを切り取ってからもう一度エンドレコードと同じやり方で検索すると、トレーラレコードが取得できます。
データレコード
ヘッダ・エンド・トレーラを前述の手順で切り出してしまえば、
.{30}
で引っかかるのがデータレコード、となります。
レコード種別に関係なく30byteずつ分割する
(.{30})
を\1\n
と置換すると、30byte引っかかるごとに改行を挟むことになるので、結果的に分割できます。なお改行コードが気になる方は文字コード環境に合わせて\n
なり\r\n
なり¥r¥n
なりに変更してください。
おわりに
機械学習や人工知能の波が押し寄せようと来まいと、データフォーマットの変換がなくなることはないでしょう。固定長・CSV・XML・JSOなど、どんな何が来てもグリっと変換できるようにしておけば、平成の次の時代でも困ることはないはず(たぶん)。
唐突にテキストファイルだけ渡された時、しれっとフォーマット変換しなければいけない、だが手元にテキストエディタしかないのだが?な時にこの記事が役に立ったら幸いです。
【追記】分割されたファイルから改行を消す
\n
をブランク(≠半角スペース)で置換すれば元に戻ります。