まずは復習から
AS400にも日本語対応の項目別名的なものがあるが取得するのは難しい
当社のAS400テーブル(MASTER/OFFICE)の情報を DSPFMT で見てみると、日本語記述があります…
項目名 | 桁数 | 属性 | バイト | 開始 | 終了 | テキスト | |
---|---|---|---|---|---|---|---|
S001 | 3 | 0 | B | 2 | 1 | 2 | 支社番号 |
S002 | 10 | O | 10 | 3 | 12 | 支社名 | |
S003 | 3 | 0 | B | 2 | 13 | 14 | 支店番号 |
S004 | 10 | O | 10 | 15 | 24 | 支店名 |
S001 | S002 | S003 | S004 | |
---|---|---|---|---|
1 | 10 | 札幌 | 11 | 札幌 |
2 | 20 | 東京 | 21 | 大手町 |
3 | 20 | 東京 | 22 | 秋葉原 |
4 | 20 | 東京 | 23 | 横浜 |
ヘッダとしてテキスト記述を取得することは簡単ではありません。
ユーザー関数 GetASHeader()でテキスト記述を取得し手動でヘッダ置き換え
ユーザー関数 GetASHeader()(http://a-habakiri.hateblo.jp/entry/2017/02/10/000000)でテキスト記述を取得して…
1 | 2 | 3 | 4 |
---|---|---|---|
S001 | S002 | S003 | S004 |
支社番号 | 支社名 | 支店番号 | 支店名 |
GetASHeader()で取得したヘッダに手動で置き換えました
支社番号 | 支社名 | 支店番号 | 支店名 | |
---|---|---|---|---|
1 | 10 | 札幌 | 11 | 札幌 |
2 | 20 | 東京 | 21 | 大手町 |
3 | 20 | 東京 | 22 | 秋葉原 |
4 | 20 | 東京 | 23 | 横浜 |
が、項目を間引いて抽出した場合にはそのままヘッダを置き換えることはできません。
データフレームのヘッダをASのテキスト記述で置き換えるユーザー関数 ReplaceASHeader()
ユーザー関数 ReplaceASHeader()
ユーザー関数 ReplaceASHeader()
ReplaceASHeader<- function(.Rdf,.AsTable) # ユーザー関数 GetAS400()、GetASHeader()が必要。 # .Rdf : R のデータフレーム # .AsTable : .Rdfの元になっているASのテーブル # ライブラリ名.テーブル名 の形で { # ASからヘッダとテキスト記述を取得し連想配列風に格納 Hd<-GetASHeader(.AsTable,"") ASHeader<-Hd$COLUMN_HEADING names(ASHeader)<-Hd$COLUMN_NAME # Dataframeのヘッダを連想配列的に置き換え for (i in 1:ncol(.Rdf)){ names(.Rdf)[i]<-as.character(ASHeader[names(.Rdf)[i]]) } return(.Rdf) }
この関数は、元となっているAS400のテーブル情報から 連想配列 ASHeader を作ります。
MASTER/OFFICE の例で言うと テキスト記述(“支社番号”,“支社名”,…)が値にセットされ、"S001",“S002"…という通常の項目名がASHeaderのラベル(連想配列のキー)になります。たとえば、ASHeader[‘S001’]は"支社番号"が格納されています。
次に、データフレームのコラム名("S001”,“S002"など)を、連想配列もどきを用いて順にテキスト記述("支社番号”,“支社名”,…)に置き換えています。
注意
- RODBC、ユーザー関数 GetAS400()、GetASHeader() が必要です。
- ライブラリ名/テーブル名 ではなく、 ライブラリ名.テーブル名 の形で指定して下さい。
ユーザー関数 ReplaceASHeader() の使用例
ユーザー関数 ReplaceASHeader()で記述欄をヘッダとして取得する例
# ASからSQLでデータを取得してサンプルデータフレームとする (D<-GetAS400("Select S002,S003,S004 from MASTER.OFFICE limit 1")) S002 S003 S004 1 札幌 11 札幌 # データフレームのヘッダを書き換え (ReplaceASHeader(D,"MASTER.OFFICE")) 支社名 支店番号 支店名 1 札幌 11 札幌