axjack's blog

### axjack is said to be an abbreviation for An eXistent JApanese Cool Klutz ###

固定長ファイルをテキストエディタで分割する

はじめに

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なりに変更してください。

おわりに

機械学習人工知能の波が押し寄せようと来まいと、データフォーマットの変換がなくなることはないでしょう。固定長・CSVXML・JSOなど、どんな何が来てもグリっと変換できるようにしておけば、平成の次の時代でも困ることはないはず(たぶん)。

唐突にテキストファイルだけ渡された時、しれっとフォーマット変換しなければいけない、だが手元にテキストエディタしかないのだが?な時にこの記事が役に立ったら幸いです。

【追記】分割されたファイルから改行を消す

\nをブランク(≠半角スペース)で置換すれば元に戻ります。

axjack is said to be an abbreviation for An eXistent JApanese Cool Klutz.