読者です 読者をやめる 読者になる 読者になる

ヘッダー(項目名行)なしのファイルリスト

次のファイルリスト作成の記事に関する補足です。

フォルダの中のファイルリストを作成する(Designer)http://xoblos.hatenablog.jp/entry/2017/04/10/002209

この例では、1行目に「ファイル名」という名前の項目名、2行目以降にファイル名のリスト形式で説明しました。

しかし、リスト形式データの場合、1行目からデータが始まり、項目名の行(ヘッダー行)がない場合もあります。

その場合は、「手順の繰り返し実行の設定」で [1行目はヘッダ行ですか?] を「いいえ」に設定し、$(item:"item1") のように指定して項目を参照できます。("item1" はヘッダー項目の1番目を表します)

上記の記事の例では、batファイルの内容を

dir INPUT /B A-D > filelist.csv

にすれば大丈夫です(ヘッダー行なしでリスト出力されます)。

ファイルの参照順序

複数生成時は、都度前提(雛形)を意識する。

f:id:xoblos:20170526160036p:plain

昨日記事で、上図のような生成結果を列挙しました。「ようし自分も試してみよう!」と勇ましく生成を試みた方の中で‥‥異なる結果が出た方はいらっしゃいますでしょうか。

f:id:xoblos:20170526160044p:plain

生成部分で、制御シートや業務(.xob)ファイルに示さなかったのですが、上図 3つの入力ファイルを取り扱うという設定内容に差が考えられます。

f:id:xoblos:20170526161918p:plain

一つの雛形に対し複数の入力ファイルを取り扱う、或いは複数回生成を行う場合は、各回の生成結果が常に次回の雛形になることを忘れてはなりません。上図「差異.xml」を先頭に指定してしまえば、「菅野」と「大野」が先ず生成され、後の 2ファイルはそれを前提に上書き生成するので、「比較ID」の情報が消えてしまいます。

※この設定を制御シートで行う場合は、キーワード『ファイル』を複数行で書きます。

曖昧(ワイルドカード)指定の注意点

「3つのファイル全部取り扱うから、自分はワイルドカード指定して正常に生成された!」と安心しているそこのあなた。ワイルドカードは便利ですが、順序を問うような要件が係る場合は、軽んじてはなりません。

f:id:xoblos:20170526160051p:plain

上図のような設定は、確かに 3つの入力ファイルを取り扱う設定になっています。しかし、参照順序は実行しているシステムに依存します。この為、上図設定で「うまくいった!」という方と「うまくいかなかった!」という方と、分かれることは充分あり得ます。

確かな設定は、一つ一つ正しい順序でファイル設定するか、通し番号を各データに割り振ってソートするかの、いずれかになります。生成の手順を入力ファイル数分、用意するのは現実的ではありません。

データの比較

XmlMatcher.exe のお仕事。

Designer も corabo も、インストールフォルダ内に[helper]という階層があり、そこに「XmlMatcher.exe」は居ます。当プログラムは業務(.xob)ファイル内でいう、『抽出データ比較』手順にて活躍します。

f:id:xoblos:20170525150012p:plain

上図左を変更前、右を変更後としてそれぞれ単純抽出します。各 xml ファイルを、下図のように『抽出データ比較』手順で設定します。

f:id:xoblos:20170525150021p:plain

この手順を実行すると、比較結果の xml ファイルが作成されます。

f:id:xoblos:20170525151840p:plain

各抽出データは、生成要件に合わせて要/不要が分かれます。下記を前提に、いくつか例を挙げてみましょう。

:「変更前.xml:「変更後.xml:「差異.xml

差異情報のみ欲しい

『抽出データ比較』手順は、差異あるデータのみ抽出します。そのため、ここで必要な抽出データは③のみになります。

f:id:xoblos:20170525150033p:plain

差異の有無問わず全体の情報が必要

よくあるケースとしては、差異分析はするけれど出力内容はあくまで全体というものになります。しかし前節のとおり、③は差異の情報しか持っていません。全体情報(全員の名前)を得るためには、①と②のデータも基本入力データとする必要があります。

f:id:xoblos:20170525150041p:plain

生成先の差異情報は行(データ)単位で示したい

更によくあるケースとしては、全体の情報にプラスして結局人一人の新旧情報がどうであったのかも示すというものです。無論、このケースでも①~③いずれのデータも使用することになります。下図の作成例は、どちらかと言えば中間処理寄りですね。

f:id:xoblos:20170525161946p:plain

それぞれの生成結果は下図のとおりになります。各抽出データの在り方を意識し、様々な帳票要件をこなしてください!

f:id:xoblos:20170525150103p:plain

空白の情報を許さない

空白情報を操作するタイミング。

ある日、Aさんと Bさんは地元一番のお食事処を知るために、手分けして調査をしました。調査後、その結果を一覧化することになったようです。

f:id:xoblos:20170511140716p:plain

必要としているのは確かな情報なので、不毛な収穫の反映は避けたいところです。上図、生成の雛形シートに関する制御シートは、以下例のように作成します。

f:id:xoblos:20170511140726p:plain

ここでのポイントは二つ。一つは、「情報1」「情報2」という異なる項目であるにも拘わらず、『セット先セル』の内容が同じということ。もう一つは、キーワード『空データでの上書禁止』の「禁」設定です。

これらは、「情報1」と「情報2」のいずれもセル「B2」へ順に出力させるけれども、どのタイミングで空白が来ても、値を持った内容を優先的に出力させるという仕組みになっています。

f:id:xoblos:20170511140732p:plain

生成してみました。E店の情報は二人とも得られなかったようなので、空白がくるのは仕方がありません。

D店は、後勝ちで Bさんの情報が反映されています。‥‥確かな情報としては、「駅から遠い」も必要かもしれません。他キーワードや関数で、Aさんと Bさんの情報をまとめた上で出力する仕組みを考えてみてください。

抽出元データの空白は、未調査であったのか余りに不評でノーコメントであったのかが掴めません。何かに徹底しているのであれば、生成の雛形シートのセル「B2」に、事前に固定情報をいれておけば、『空データでの上書禁止』の活躍は広がります。

抽出時点で空白の内容を固定化:キーワード『データが無いときの値』を使用。
生成時点で空白の内容を固定化:雛形シートに予め固定情報をいれておく。
                ※前回記事も参照。

雛形シートの作り方

大きく二種類。

xoBlos の生成処理で、生成するレイアウトのベースとなるのは雛形シートです。これは、大きく分けて二つの作り方があります。一つは、最低限必要な(共通する)レイアウト部分を用意すること。もう一つは、既存情報(出力するデータの情報)を予めいれておくこと。‥‥後者の情報は、分類または見出しの項目で、判断させることができます。

f:id:xoblos:20170508165657p:plain

上図を期待する結果として、様々な要件をこなしてみましょう。「ID」は分類項目とします。‥‥先ず最初の要件は、"抽出時に読み込んだ順で、一から単純生成する" です。

f:id:xoblos:20170508165701p:plain

上図のように、最低限必要なレイアウト部分を用意するパターンになります。データは増えていくので、キーワード『行ひな形の左上』が必要になりますね。

それでは次に、"ID が 1~4 のデータだけ出力して他データは出力させない" という要件を挙げられた場合には、どのように作りましょうか。

f:id:xoblos:20170508165706p:plain

上図のように、既存情報を予めいれておくパターンになります。データは増えないので、キーワード『行ひな形の左上』は設定してはいけません。しかしこれだけでは、ID が 1~4 以外のものも処理上読み込まれ、新規に行を追加しようとします。ですが『行ひな形の左上』が無いのでエラーが起こってしまいます。‥‥それを防ぐ役割を持つキーワードが、『行・列の作成禁止』の「禁」設定になるのです。

では最後に、"ID が 1 と 2 のデータはくることが分かっていて絶対出力して欲しいのだけれど、他にどんなデータが来るかは分からない" という要件を挙げられた場合は、どのような雛形シートを作ることになるでしょうか。

f:id:xoblos:20170508165711p:plain

上図のように、両パターンを合わせた形になります。

②と③のような、既存情報を入れておくことができる点は、出力するデータの順序をユーザレベルで操作/定義できる利点にも繋がります。例えば "ID が 2、4 のデータは上位に出力したい!" という要件を実現するには、どのような雛形シートを用意すれば良いか考えてみてください!

「%Row」の役割

抽出と生成で差が出る役割。

「%Row」は xoBlos の予約語の一つであり、内部で自動的に採番値を作成する面は、抽出も生成も同じです。いずれも採番値に対し 1000000 を加えて先頭に "R" を付けた文字列が入ります。但し、作成するまでの過程に差があります。

f:id:xoblos:20170502105754p:plain

先ずは上図――抽出用の「%Row」を設定してみましょう。抽出元には存在しない情報なので、キーワード『対象セル』に「%Row」と設定します。

f:id:xoblos:20170502105800p:plain

続いて上図――前述で抽出したデータを用いつつ、生成用の「%Row」を設定してみましょう。キーワード『入力項目名』に、基本データには存在しない項目なので、「#」始まりで項目を設定します。そしてキーワード『固定値』に「%Row」とします。

f:id:xoblos:20170502105806p:plain

生成結果です。D列と E列に差が出ましたね。結果からも判断できるかもしれませんが、以下の仕組みの差がありますので、取り扱いにご注意ください。

抽出での「%Row」:抽出元の、データが置いてある Excel 行 No を見ている。
生成での「%Row」:基本入力ファイルの、レコード No を見ている。

xoBlos の中間処理

基本形態と考え方はいつでも同じ。

xoBlos の役割として、基本は「(入力データから)データの抽出」~「(抽出データを使って)帳票の生成」という形態になります。他にも「データの加工」という役割も持っていますが、これはどういう仕組みになるのでしょうか。‥‥難しいことではありません。加工も結局のところ、「(入力データから)データの抽出」~「(抽出データを使って)中間データの生成」という、同じ形態を確立することなのです。

中間処理で関わるデータは、どういう作りであっても構いません。XML データ、雛形シート、いずれも内部で取り扱われるものなので、見た目や表現は重要視しなくて良いのです。

相手は Excel

f:id:xoblos:20170428132701p:plain

制御シートのキーワードには、抽出データの内容を編集/判定するものも用意されています。ただ、それを活用しても期待する結果を得られない要件が出てくる場合もあります。例えば上図、C列と D列に出力される内容を、B列の内容によってどちらか一方を「対象」とする要件があったとしましょう。一項目にそれらを纏めるにはどうしたら良いでしょうか。

雛形シートを用意する時点で Excel の標準機能に触れることになりますが‥‥そうなれば Excel の機能さえもフル活用してしまえば、抽出データに存在しなかった情報を取り扱うこともできるようになるのです。

f:id:xoblos:20170428132709p:plain

上図雛形シート E列に、一列設けました。ここに Excel の関数が入れてあります。その為、制御シートのキーワード『対象部分の右下』は「E3」まで伸びました。たとえ抽出データに存在しない内容(列)であったとしても、繰り返す範囲を明示しなければ、各レコードの情報は正しく得られません。

f:id:xoblos:20170428132714p:plain

表のレイアウト、2行目の列項目名――。全て開発やメンテナンスのし易さを意識した上で、自由なのです。最終的に生成する帳票上に必要とされるデータ(上図例で言えば E列)を抽出できれば、問題はありません。