저널 CSV로 변환 (예) | Power Query

6173 단어 ExcelPowerQuery
작업 무늬, 회계 시스템에 흘리는 저널의 CSV가 처리의 종착점이라고 하는 것이 많습니다.
개인적으로는 Power Query로 끝내는 것이 사안마다의 커스터마이즈가 쉽고, 좋아합니다.

하고 싶은 일



아래 이미지와 같습니다. 행마다 대차를 치지 않고, 차변은 집계치로 분개하고 싶다고 하는 케이스입니다.
※실제로는, 그 회계 시스템마다의 열 정의가 있는 것입니다만, 여기에서는 적당하게 그것 같은 것을 창작했습니다.


샘플 데이터



아래 코드를 Power Query 고급 편집기에 복사하여 이름을 지정하고 별도의 쿼리로 만듭니다.
위 그림의 "어떤 데이터"와 "저널 열 정의"와 같은 데이터가 가능합니다.

t_매출
let
    Source = "lZRNjsMgDIXvwroj2WDzk0PMBZpZpEnYdpXVqHcfm66mBESk6Cnix3x6PHP/NfPheef5oH2LZjIWLH6BfN7cZI5zCrICIcs/Uvx+msmWCVpRFTbZNB8OAqvGRZUeqoylhOcA85FwzWYKZavjKOflBc1EDnQo4SbVUiSp5gDhdWuDpYtgfn+DVTDxE8ZhBWMp9mDQNmHwFIbEn+icl9XZrg2XKjCkCgzRdsG4CeZOwZZNdQfVdQSJayQLXaRriYorqUshZD1loQqJB64PmbtI7Sx1XXKqWypeDYCFGsz1wWw7V+chpwIWSw+qb2OBT3X3BaIuGF10bOhZ8J9gkqSL6bLtdJ2DNZ8FV+XqpPug2332aq6GnoV3iv7dX00mQ/D6+QM=",
    Custom1 = Binary.FromText(Source),
    Custom2 = Binary.Decompress(Custom1,Compression.Deflate),
    Custom3 = Json.Document(Custom2),
    Custom4 = Table.FromRecords( Custom3 ),
    #"Changed Type" = Table.TransformColumnTypes(Custom4,{{"日付", type date}, {"得意先No", Int64.Type}, {"品名", type text}, {"数量", Int64.Type}, {"単価", Int64.Type}, {"金額", Int64.Type}})
in
    #"Changed Type"

t_열 정의
let
    Source = "jZGxDsMgDET/hTkDDhjsrnSv1I5NhwTIHzBV/feaTkiFKMtJWHcPn/x8q6XgDF7U6qQu8jQ6UdVofqrVJENaQYZodi+ex+2uNajP1Ek7zLgUmxMNcnM/hxr2mt54KZ4TiLqc/xnX8dctgijFali5jzixBUPdgsmmPsL0ERQ3OlMkjIu0iKMiYVykRRwVCeMizqL4iAkGl5Tc6ws=",
    Custom1 = Binary.FromText(Source),
    Custom2 = Binary.Decompress(Custom1,Compression.Deflate),
    Custom3 = Json.Document(Custom2),
    Custom4 = Table.FromRecords( Custom3 ),
    #"Changed Type" = Table.TransformColumnTypes(Custom4,{{"列名", type text}, {"記号", type text}})
in
    #"Changed Type"

코드



완제품
let
    Source = t_売上,
    仕訳日 = Date.EndOfMonth(Source[日付]{0}),
    //やりやすい方法で
    摘要入れ = Table.AddColumn(Source, "摘要", each Text.Format("#[品名]@#[単価]x#[数量].",_) & Date.ToText([日付],"M/d"),Text.Type),
    #"Removed Columns" = Table.RemoveColumns(摘要入れ,{"品名", "数量", "単価","日付"}),
    貸方科目類入れ = Table.AddColumn(#"Removed Columns", "科目セット", each [貸方科目=500,貸方補助=0]),
    #"Expanded {0}" = Table.ExpandRecordColumn(貸方科目類入れ, "科目セット", {"貸方科目", "貸方補助"}, {"貸方科目", "貸方補助"}),
    #"Renamed Columns" = Table.RenameColumns(#"Expanded {0}",{{"金額", "貸方金額"}}),
    得意先別まとめ = Table.Group(#"Renamed Columns", {"得意先No"}, {{"借方金額", each List.Sum([貸方金額]), type nullable number},{"tbl",each _}}),
    #"Sorted Rows" = Table.Sort(得意先別まとめ,{{"得意先No", Order.Ascending}}),
    借方科目入れ = Table.AddColumn(#"Sorted Rows", "借方科目", each 135),
    #"Renamed Columns1" = Table.RenameColumns(借方科目入れ,{{"得意先No", "借方補助"}}),

    //ポイント1
    fx_接着 =(つける物 as record,BaseTbl as table)=>[
                最初の行_rec = つける物 & BaseTbl{0},
                最初の行_tbl = Table.FromRecords({最初の行_rec}),
                その後の行 = Table.RemoveFirstN(BaseTbl,1),
                result =Table.Combine({最初の行_tbl,その後の行})
    ],
    貸借の接着 = Table.TransformRows(#"Renamed Columns1",each 
                    fx_接着(
                        Record.RemoveFields(_,{"tbl"}),
                        [tbl]
                    )[result]
                ),
    debug_貸借の接着 = Table.TransformRows(#"Renamed Columns1",each fx_接着(Record.RemoveFields(_,{"tbl"}),[tbl]) ){1},
    単純合体 =Table.Combine(貸借の接着),
    ヘッダの接着 = fx_接着([ヘッダ="*",日付=仕訳日],単純合体)[result],
    debug_ヘッダの接着 = fx_接着([ヘッダ="*",日付=仕訳日],単純合体),

    //ポイント2
    できあがり確認 = Table.SelectColumns( ヘッダの接着,t_列定義[列名] ),

    //数値だとCSV出力に不向きの場合があるので、よくやる。
    #"Changed Type1" = Table.TransformColumnTypes(できあがり確認,{{"日付", type text}}),
    //出来上がりに問題なければ最終的にはCSV用ヘッダ置換後で出力する
    置換後 =Table.RenameColumns(#"Changed Type1",Table.ToRows(t_列定義)),

    完成=#"Changed Type1"
in
    完成

약간의 해설



포인트 1



반복해서 같은 것을 써도 괜찮습니다만, 커스텀 함수를 정의해 처리하고 있습니다.
모색하면서 쓰는 경우, record 기법으로 쓰고, 도중 경과를 들여다 보도록 해 가면 하기 쉬울까라고 생각하고 있습니다.
여기에서는, 전처리가 끝난 것을 「result」라고 명명하고 있습니다. 이 명칭이나 쓴 순서는 처리에 관계 없습니다.
↓함수 결과가 record 로서 나오는 모습


포인트 2



1대로 처리한(라고 생각한) 개소에서, 열의 재정렬 처리를 넣어 주면(자), 처리 잊어버린 열이 있거나, 표기 오류가 있으면, 열의 재정렬의 개소에서 에러가 나오므로, 확인할 수 있습니다.


참고


record 정보
htps : // / cs. mic로소 ft. 코 m / 자 jp / 푸 r 쿠 ry m / 에 xp 뻬시 온 s ゔ ぅ 에 s an d ぇ t 에 xp 뻬시 온 # 레코 rdText.Format 함수
htps : // / cs. 미 c 로소 ft. 코 m / 쟈 jp / 뽀 r 쿠 ry m / xt fu rma tTable.TransformRows 함수
htps : // / cs. 미 c 로소 ft. 코 m / 쟈 jp / 포 r 쿠 ry m / 타 b ぇ t 란 s 후 rm 로 ws

구현 환경



Excel365(버전 2101)
Power Query 2.88.201.0 64비트
※특히 새로운 함수를 사용하고 있지 않으므로, Excel2010・2013의 애드인판에서도 같을 수 있을 것이라고는 생각합니다.

좋은 웹페이지 즐겨찾기