버스 요금표를 테이블로 변환

트위터에서 버스 요금표를 읽는 Excel 문제를 보았으므로 Power Query에서 변환 쿼리를 생각해 보았습니다.
낭비에 긴 감이 있고, 완패입니다.
다른 답변 예 등, 코멘트하실 수 있으면 기쁩니다.
※2019/6/30 추기:쿼리 예 그 2를 넣었습니다.

요금표의 예



예를 들어 아래의 코드를 상세 편집기에 붙이면 테이블이 됩니다.

원래 요금표
let
    Source = "vZK7DsIwDEX/xXMH5+mmK59BGdqmmQpMmRD/jpsCSnhULHSxfBRF58bx/gK78xSPJwENtNEI27fRkqy5H0hwld60kaR16XTgSkJCdb8moZGID1JM5km6IFOQLYigUYjXKgtzitOUSTibIyPbWGvtlmyQW7GwYmHF71amNWuOahmQ934eRG3gVyEWwvVnvghz1IvfBvY76/ibFPapBpX6kPoBtkiSo1mCOUm8J0Z1/EeOwsdt+WuIHO3bxjgUnEyPiHNK28E2KXKkFEqPfl5gFRCuhxs=",
    Custom1 = Binary.Decompress(Binary.FromText(Source),Compression.Deflate),
    Custom2 = Table.FromRecords(Json.Document(Custom1))
in
    Custom2

요금표의 모습


변환할 쿼리: 1



당초 생각해 낸 안입니다.

코드


let
    Source = 元の料金表,
    #"Filled Down" = Table.FillDown(Source,Table.ColumnNames(Source)),
    #"Reversed Rows" = Table.ReverseRows(#"Filled Down"),
    Custom1 = Table.ToColumns(#"Reversed Rows")& 
              {{"発駅"} & List.RemoveFirstN(List.Reverse(Record.ToList(#"Reversed Rows"{0})),1) },
    Custom2 = Table.FromColumns(Custom1),
    #"Promoted Headers" = Table.PromoteHeaders(Custom2, [PromoteAllScalars=true]),
    #"Unpivoted Other Columns" = Table.UnpivotOtherColumns(#"Promoted Headers", {"発駅"}, "着駅", "料金"),
    合成前 = Table.SelectRows(#"Unpivoted Other Columns", each Value.Type([料金]) = type number),
    Custom3 = List.Transform(Table.ToRows(合成前),each {_{1},_{0},_{2}}),
    Custom4 = Table.FromRows(
                    List.Distinct(Table.ToRows(合成前)& Custom3),
                    type table[発駅=text,着駅=text,料金=Int64.Type]
              )
in
    Custom4

처리 도중 이미지



Reversed Rows





Custom1





Custom2





Unpivoted Other Columns





완성도





변환할 쿼리: 2



다시 생각한 안입니다. 오이타 깨끗했습니다.

코드


let
    Source = 元の料金表,
    各行をリストにしてNull除去 = List.Transform(Table.ToRows(Source),each List.RemoveNulls(_)),
    駅リスト = List.Transform( 各行をリストにしてNull除去,each _{0} ),
    片側データ =List.Combine(
                     List.Transform( 各行をリストにしてNull除去,each 
                        [発=_{0},
                         着= List.RemoveFirstN(駅リスト,List.PositionOf(駅リスト,発)+1),
                         料金=List.RemoveFirstN(_,1),
                         料金一覧 =List.Zip({List.Repeat({発},List.Count(着)),着,料金})
                        ][料金一覧]
                    )
               ),
    逆データ =List.Transform(片側データ,each {_{1},_{0},_{2}}),
    テーブル化 =Table.FromRows( 片側データ& 逆データ,type table[発=text,着=text,料金=Int64.Type] )
in
    テーブル化

해설



요점은 "한쪽 데이터"의 위치에서 "착용"목록을 얻는 것입니다. 예를 들자.


역 목록 뒤에 삽입
    x=各行をリストにしてNull除去{2}{0},      //・・・"川内"が返って来ます
    y=List.PositionOf(駅リスト,x),     //・・・2が返ります。(0始まりで数える)
    z=List.RemoveFirstN(駅リスト,y+1),    //・・・川内より後の駅リストが返ります。


테스트 코드를 본 코드에 삽입해 시험하면, 카와우치보다 후의 4 역이 잡혀 있는 것을 알 수 있습니다.

좋은 웹페이지 즐겨찾기