1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

全銀固定長データを1件だけ読んでみた

Last updated at Posted at 2019-05-06

2019/5/14追記:複数データ版別記事でUPしました。
続 全銀固定長データ~複数件データを読む(Power Query)

1ファイルに1件だけしか入っていないケースを前提に、読み取るクエリを作ったので、書き残しておきます。
(当方、固定長データは実務で使ったことがないです。何件も読む必要がある方はご自分で工夫してみてください。

###用意するもの
#####固定長のデータ
今回は下記サイトのPDF「CSVファイルのデータ項目説明」をもとに、作成しました。
 CSVファイルのサンプルダウンロード|ジャパンネット銀行

下記を詳細エディタに貼るとテーブルになるはずです。

全銀固定長データ
let
    ソース = Json.Document(
                    Binary.Decompress(Binary.FromText("i45WMjQyNFCAg/d797zfN+/93jXv93W93zf//b6O9/sa3u+b/X7vZgX8wMDCwNDAwNgYXdgAXcTQ0sDAyARDoYKCEVHaEUZYmLzf1/x+7973+1re7933ft/c9/umAd2p8X7vNuwuBANDEIHXJxYIdTAGXvXUApZ0sQUTKMXGAgA=",BinaryEncoding.Base64),
                                      Compression.Deflate
                    )
            ),
    ソース1 = ソース{0}{0}
in
    ソース1

#####固定長の区分表
今回は同じくPDFから拾いました。下記を詳細エディタに貼るとテーブルになるはずです。

桁指定シート
let
    ソース = Table.FromRows(Json.Document(Binary.Decompress(Binary.FromText("lZTbToNAEIbfhWsuoPUQn4X0XQgbBZSG1thSbUxKbS0apU1MNFmxPswyHK76Ci6tAZp2YbkggeX7d2bnn1lFEQjSCQqI9gsWBuNKEAWZPgSNCEIEqdk/9Ea0j+2LKXRERYg9H4x5sSYKrTpJ/sUfJbKWyToI14/pJAgxLoeTpYZi6HWp4oRTFjnzjOaD4RKl12riWuUEm2p3+cmn3LLobgnYKYdsN9Q2DplOeqnep97HY5/fPyoE+wnwIh68gv1FRed1whAboN1nIWpRVvP+rx7wLKeq+b1SsVCWI9U839bmDfxMQzyL7HFkqnkla3I/5hcLPuoRG3bAHuZj1Zaqs9/2AU0ldbvF7DLp4Sp5tveGvfqU7gL8ab62Cfr1MQ40txx57W4GSwf/gbPZkvcRvSYT14tnuBbOm7669KyGNzIyw16OjQn0jMQzwu/PaLCi+Bm3pHCtxaEpBlfiyYpxFs0jiGJmxfbyBRvs/AE=", BinaryEncoding.Base64), Compression.Deflate)), let _t = ((type text) meta [Serialized.Text = true]) in type table [項目名 = _t, 桁数 = _t, 区分 = _t]),
    変更された型 = Table.TransformColumnTypes(ソース,{{"項目名", type text}, {"桁数", Int64.Type}, {"区分", type text}})
in
    変更された型

###処理の流れ

  1. 固定長データを、桁指定シートの指示にしたがい、区分別に分割し、1文字ずつばらしたリストで持つ。
  2. 区分名を引数にして、桁指定シートのとおりに分割する処理をカスタム関数で作成。
  3. 区分名だけのテーブルにカスタム関数を適用

###クエリのコード
####区分別に1文字ずつばらすクエリ

全銀各要素
let
    Source = 桁指定シート,
    #"Grouped Rows" = Table.Group(Source, {"区分"}, {{"区分別桁数計", each List.Sum([桁数]), type number}}),
    #"Added Index" = Table.AddIndexColumn(#"Grouped Rows", "インデックス", 0, 1),
    #"Added Custom" = Table.AddColumn(#"Added Index", "累計文字数", each List.Sum( List.FirstN(#"Added Index"[区分別桁数計],[インデックス]) )),
    #"Added Custom1" = Table.AddColumn(#"Added Custom", "Value", each List.Range(全銀固定長データ,if [累計文字数]=null then 0 else [累計文字数],[区分別桁数計])),
    #"Removed Columns" = Table.RemoveColumns(#"Added Custom1",{"区分別桁数計", "インデックス", "累計文字数"}),
    #"Renamed Columns" = Table.RenameColumns(#"Removed Columns",{{"区分", "Name"}})
in
    #"Renamed Columns"

####パースするカスタム関数

fx_区分別パース
(区分名 as text)=>
let
    区分名で絞込 = Table.SelectRows(桁指定シート, each ([区分] = 区分名)),
    文字列リストの取得 = Table.AddColumn(区分名で絞込,"Value",
                                each 全銀各要素{[Name=[区分]]}[Value]
                        ),
    インデックス列追加 = Table.AddIndexColumn(文字列リストの取得, "インデックス", 0, 1),
    累積文字数列追加 = Table.AddColumn(インデックス列追加, "累積文字数",
                             each List.Sum( List.FirstN(インデックス列追加[桁数],[インデックス]) )
                      ),
    項目別文字列の取得 = Table.AddColumn(累積文字数列追加, "カスタム", each 
                                List.Range([Value],
                                            if [累積文字数]=null then 0 else [累積文字数],
                                            [桁数])
                        ),
    文字列の連結 = Table.AddColumn(項目別文字列の取得, "カスタム.1", 
                             each List.Accumulate([カスタム],"",(state,current)=>state&current)
                  ),
    不要行削除 = Table.RemoveColumns(文字列の連結,{"桁数", "区分", "Value", "インデックス", "累積文字数", "カスタム"})
in
    不要行削除

####カスタム関数を適用した完成品

完成品
let
    Source = 桁指定シート,
    #"Removed Columns" = Table.RemoveColumns(Source,{"項目名", "桁数"}),
    #"Removed Duplicates" = Table.Distinct(#"Removed Columns"),
    #"Invoked Custom Function" = Table.AddColumn(#"Removed Duplicates", "データ", each fx_区分別パース([区分]))
in
    #"Invoked Custom Function"

###環境
Excel(Office365 バージョン1904)
Power Queryバージョン:2.68.5432.241 32 ビット

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?