フラットファイルをご存知でしょうか?
様々な意味があるようですが、ここでは古いシステムでよく使われている固定長フィールドのデータのことを指します。このようなファイルは項目がカンマなどで区切られていないため、読み込み時もしくは読み込んでから、各項目が何文字なのか、ということを手動で指定する必要があります。
今回はこのフラットファイルをDesignerで読み込んでみたいと思います。
フラットファイルの読み込み方
Designerでフラットファイルをよみこむ場合、拡張子がTXTなどであれば、以下のようなダイヤログが出てきます。

ここで、上のように「固定幅のテキストファイルとして読み込む」を選択する必要があります。これでOKをクリックすると、次のようにどこに項目の区切りがあるのか指定する画面になります。

マウスで定規(ルーラー)のある部分をクリックすると、そこが区切りとして認識されます(赤いラインが引かれます)。レコードの全体の長さは変更することができますが、各フィールドの長さはキーボードから変更することができないのでご注意ください。

フィールド名やデータ型を適切なものに変更すれば、設定は完了です。OKボタンをクリックして読み込みましょう。ちなみに、5行目が2項目分欠落したデータになっているため、「短い行を許可する」オプションにチェックを入れないと警告がでます。

これにより無事にプレビュー部分で確認できました。
文字コードが日本語ShiftJISの場合
ところで、ファイルに日本語が入っているケースもあるかと思います。この場合、文字コードが「ISO 8859-1 Latin 1」となっているので当然文字化けが発生します。それ以前に、読み込み時にズレて表示されます。また、データ型で「V_WString」が選択できません。

しかし安心してください。ズレているように見えますが、全角の日本語を2文字分として、文字列の長さのとおりにちゃんと分割されます。この状態でOKを押してみましょう。

プレビューで見る限りそれっぽく分割されています。
ちなみに、コードページで日本語Shift-JISは選択できないので、このままにしておきます。このあとに文字コード変換のため複数フィールドフォーミュラツールを配置し、以下の通り設定します。

文字コード変換を行いたいフィールドにチェックを入れ、「出力データ型を変更」にチェックを入れ、「V_WString」を選択します。サイズは格納できるサイズにしておきましょう。そして、数式として以下の数式を使用します。
ConvertFromCodePage([_CurrentField_], 932)
なお、フォーミュラツールを使用する場合は、既存フィールドに対してデータ型の変更ができないため、複数フィールドフォーミュラを使うのが楽ちんです。
これにより、以下のように文字化けしていたものが、

以下のようになります。

文字コードがUTF-8の場合
UTF-8は可変長エンコーディングを採用しているため、日本語、英語が混じっていると正常に読み込みができません。フラットファイル読み込み時、文字数=1バイトで表現しており、全角文字は見た目二文字分のスペースを取っているように見えますが、実は内部的には3文字分(もしくはそれ以上)のデータを持っている場合があり、そのような場合は結果がズレます(そもそも日本語が混じっている場合、全長が正しく計測されません)。
とはいえ、UTF-8は昔のシステムで採用されていることはないため(そもそも存在していなかった)、UTF-8のフラットファイルはない、と思って差し支えないように思います(たぶん)。
もしこのようなデータがあれば、一旦読み込んでから対処する必要があります。例えば、以下のように正規表現を使うことができます。

今回の場合は、最初のカラム、最後のカラムが両方とも4文字固定になっているため、比較的簡単にフィールドを分割することができました。しかし、パターン的にうまくいかない場合は少し(?)工夫が必要です。
厳密に文字数がXX文字までをフィールドXXとする、といった場合は、以下のように行います。
- レコードIDツールで行IDを付与する
- 正規表現ツールで1文字ずつに分割する
- 全角文字を2、半角文字を1とする
- 複数行フォーミュラツールで、文字位置を行ごとに計算
- 文字位置に応じたフィールド名を付与
- クロスタブで文字列を結合し、適切なフィールドに格納
この手順の5の部分は、以下のような計算式を使って、文字位置によって適切なフィールド名を各文字に与えます。ここはファイルによって異なるので汎用性がない部分です。
IF [length]<=4 THEN "No"
ELSEIF [length]<=16 THEN "Name"
ELSE "UnitPrice" ENDIF

汎用的なものにするにはマクロが必須となりますので、ご注意ください。
まとめ
- フラットファイル(固定長フィールドファイル)の読み込み方をご紹介しました
- 日本語が混じっている場合は若干注意が必要です(文字コード変換)
- 文字コードがUTF-8であることはほぼないと思うので、UTF-8の部分はおまけ程度で考えていただければと思います(ただ、EUC_JPの場合もUTF-8と同様の手法が適用必要です)
サンプルワークフローダウンロード
次回
未定です。
コメント