Power Query에서 반복 열 일괄 처리

5921 단어 ExcelPowerQuery
신 엑셀 시리즈에서 가끔 나온다.
옛날 재료로 만든 이것의 대응에 대해 쓰고 싶습니다.
htps : // wm 훗 x 세 l. 코 m / 2019 / 05 / 13 / sp ぃ t-Set l 콘텐트 ts - 세 파라 데 바이 - ぃr 쿠에 ry 파 rt-2 / # 누레 16516

포인트로서
열의 분할과 같은 처리는 열명 지정이 필요하고 그대로라면 열이 많으면 처리수도 늘어나,
열 수가 불확실한 데이터라면 대응이 어렵습니다.
이것을 열수 제한을 받기 어려운 「피벗 해제」와 「열의 피벗화」를 전후에 사용
처리열을 1열로 나란히 처리해 복구하는 처리를 합니다

대상



따라서 셀에 개별적으로 구분 된 여러 데이터가 들어 있습니다.
여러 번 반복하면 처리하는 방법에 대한 이야기


원본 데이터



item과 value가 연속한 데이터를


item
value
item2
value3


aaaa/bb/cc
11/22/333
dd/hh
77/44

dd/ee
44/55
ff/qq
11

ff/g
66
ss/rr
22/33

ee
7
nn/pp/cc
55/99

aaa/bbbb/cc
74/35



① 인덱스 열 추가





목적은 최종 단의 피벗 화에
1. 원행 번호
2. 셀 내 구분 위치
으로 구분하기 위해 여기에 원행 번호를 추가합니다.
이것이 없으면 여덟 번째로 오류가 발생합니다.

② 피벗 해제



색인을 선택한 상태에서 '기타 열 피벗 해제'


해제 열을 선택하고 피벗 해제도 비선택 열을 사용하여 "기타 열을 ~"
라는 코드가 생성되므로 어느 쪽이라도 좋다,
목적이 명확하기 때문에 "기타 ~"를 사용
행 추가시 피벗 해제에서 제거하려면
'선택한 열만 피벗 해제'를 선택해야 함

③열 분할



열 분할로 문자와 숫자를 분할. 열 병합 헤더에 사용


④열분할



값 열을 '/'로 열 분할


여기서 열로 분할을 열 방향 지정으로 분할하는 것이 이번 키모
헤더의 중복된 열은 UI가 자동으로 일련번호해 주므로 셀내의 단락 위치 기호로서 재이용합니다
분할 수는 크게 선택하면 큰 데이터가 들어갈 때 사라지지 않으므로 권장
사용되지 않는 열은 ⑦의 피벗 해제로 사라집니다.

⑤정수 나눗셈



[속성.2] 열에 정수 나누기



이번 데이터라면 2를 선택
Power Query에서 헤더를 지정한 것은 1부터 시작하기 때문에
전단에 가산으로 +1을 붙이는 것

⑥열 병합



원래 열 순서에 맞추기 위해
속성 .1과 속성 .2를 열 병합


⑦ 피벗 해제



열 병합을 한 행을 선택하여 2단째의 피벗 해제


⑧열 피벗



⑥로 만든 병합 열을 선택하고
값 열: 값, 고급 옵션: 집계하지 않음
에서 실시
값 열의 선택을 변경하면 고급 옵션의 내용이 변경되므로주의

이 후 불필요한 열을 삭제하고 종료

모든 쿼리 (원래 데이터 포함)



고급 편집기에 복사합니다. 어쩌면 움직일 것입니다.
let
    // 元データ取り出し部
    ソース = "VZDJDoMwDET/xWckKxsR/ZW6B5ZQKqWIpfRS8e91SkEmt0xmnuO5fuDxCk+4QMmHsKoI6xoyeJdxCSwrRag1oTGG1eTVrDYNYdftNsOK94TWwpodwOQJQaCsJXROUNqWcBwlRSlJSO93AchzEZ5nwmmS4e2bEnAa70W47wmHQa6aAM4RFoUA9EuMB2C77IR/W+e+fkXwlsbBevsC",
    a1 = Binary.FromText(ソース),
    a2 = Binary.Decompress(a1,Compression.Deflate),
    a3= Table.FromRecords(Json.Document(a2,932)),
    //
    // ここから処理
    // 
    追加されたインデックス = Table.AddIndexColumn(a3, "インデックス", 1, 1),
    ピボット解除された他の列 = Table.UnpivotOtherColumns(追加されたインデックス, {"インデックス"}, "属性", "値"),
    文字の移行による列の分割 = Table.SplitColumn(ピボット解除された他の列, "属性", Splitter.SplitTextByCharacterTransition((c) => not List.Contains({"0".."9"}, c), {"0".."9"}), {"属性.1", "属性.2"}),
    // ここの「詳細設定>分割後の行数」を多めに指定するとよい
    区切り記号による列の分割 = Table.SplitColumn(文字の移行による列の分割, "値", Splitter.SplitTextByDelimiter("/", QuoteStyle.Csv), {"値.1", "値.2", "値.3", "値.4", "値.5"}),
    変更された型 = Table.TransformColumnTypes(区切り記号による列の分割,{{"属性.2", Int64.Type}}),
    // 属性から分割した数字を使って列方向の位置を生成
    整数除算済みの列 = Table.TransformColumns(変更された型, {{"属性.2", each Number.IntegerDivide(_, 2), Int64.Type}}),
    結合された列 = Table.CombineColumns(Table.TransformColumnTypes(整数除算済みの列, {{"属性.2", type text}}, "ja-JP"),{"属性.2", "属性.1"},Combiner.CombineTextByDelimiter(":", QuoteStyle.None),"結合済み"),
    ピボット解除された他の列1 = Table.UnpivotOtherColumns(結合された列, {"結合済み", "インデックス"}, "属性", "値"),
    ピボットされた列 = Table.Pivot(ピボット解除された他の列1, List.Distinct(ピボット解除された他の列1[結合済み]), "結合済み", "値"),
        // 削除列の意味の説明
    #"名前が変更された列 " = Table.RenameColumns(ピボットされた列,{{"インデックス", "行番号"}, {"属性", "行内区切り位置"}}),
    削除された列 = Table.RemoveColumns(#"名前が変更された列 ",{"行番号", "行内区切り位置"})
in
    削除された列

좋은 웹페이지 즐겨찾기