Markdown 표로 변환 | Power Query

Excel의 테이블이나 Power Query 편집기의 테이블의 데이터에 사용할 수 있습니다.
완성품은 qiita에서만 동작 확인하고 있습니다.

2019/10/12 추기: 함수화한 코드도 올렸습니다.

제목 표



빈 쿼리에 붙이면 테이블이 됩니다. 개행도 반각 세로봉(|)도 들어가 있습니다.
※치환 작업을 하는 사정상, 어느 열도 텍스트형으로 변환해 둘 필요가 있다.

샘플
let
    Source = Table.FromRows(Json.Document(Binary.Decompress(Binary.FromText("jZDRSgJBFIbfZa69UXub1VfowquCLjpzxF0lykpbwRAUiWjZRQihZOth+psdvfIVPO3EChVrMAfO/PzwfRzPUyYIq6qiTmROZYz/YPsd834BSuyyn03uVbPiqaq5frTjRArQS/AzOARH4A50DP0KDqR/9vkSr1eRlLIpm/nThi9l36ZB8f3wb8ADcAoml9i3JLsaO15255s4FKFt2s2ptYL6zZfSH4IiRT3QCNQGDaFvHTXfu6AI5/Sj8OVBPRusGq3GcalCvVCo/UNhAdKlCvuCU3DJQYujwqJebiGX/k2WMD/8TF45qrkD", BinaryEncoding.Base64), Compression.Deflate)), let _t = ((type text) meta [Serialized.Text = true]) in type table [Column1 = _t, 列1 = _t, 列2 = _t, 列3 = _t]),
    #"Promoted Headers" = Table.PromoteHeaders(Source, [PromoteAllScalars=true]),
    #"Changed Type" = Table.TransformColumnTypes(#"Promoted Headers",{{"列1", type text}, {"x", type text}, {"y", type text}, {"処理後の結果", type text}})
in
    #"Changed Type"

↓붙이면 이렇게 된다.


코드



최소한, 셀내 개행과 세로봉의 치환은 했습니다. 그 밖에 필요한 치환이 있으면, 「치환 문자 리스트」의 곳에 써 넣으면 OK. ( {{置換文字列、置換後},・・・} 라는 구조)
표 안의 횡방향 위치는, 완성 후의 캐릭터 라인에 스스로 콜론을 더합시다.

※복수 문자열의 치환에 대해서는, 하기의 기사의 패턴 2 코드(신)로 해설하고 있습니다.
여러 단어를 함께 대체 - Qiita

q_Markdown에 대한 테이블 생성
let
    Source = サンプル,
    置換文字リスト = {{"#(cr,lf)","<br>"},{"#(lf)","<br>"},{"|","&#124;"}},
    置換用関数 =(文字列のリスト as list)=>
                    List.Transform(文字列のリスト,each 
                        List.Accumulate(
                            置換文字リスト,_,(x,y)=>Text.Replace(x,y{0},y{1})
                        )
                    ),
    タイトル = "|" & Text.Combine( 置換用関数(Table.ColumnNames(Source)),"|" ) &"|",
    タイトル下 = "|---"& Text.Repeat( "|---",Table.ColumnCount(Source)-1 ) &"|",

    中身 = Text.Combine( List.Transform(
                            Table.ToRows(Source),
                            each "|" & Text.Combine(置換用関数(_),"|") & "|"
                         ),"#(lf)"
           ),
    合成 = Text.Combine({タイトル,タイトル下,中身},"#(lf)")
in
    合成


완성된 문자열





이것을 qiita에 붙이면 아래와 같이.


열 1
x
y
처리 후 결과


첫번째
샘플 텍스트 | 내용
모모타로
(모모타로⇒피치타로 치환 후의 문자열)

두번째
첫 번째 처리 후 결과
할아버지
(게다가 할아버지 ⇒ 할아버지 교체 후의 문자열)

3번째
2번째 처리 후의 결과
할머니
(또한 할머니 ⇒ 할머니 교체 후 문자열)

4주차
3번째 처리 후의 결과
복숭아
(게다가 복숭아⇒모모 치환 후의 문자열)



테스트 환경



Windows7, Office365 Excel (32 비트. 버전 1908)
Power Query 버전: 2.72.5556.441

보충:개행에 대해서



입력 방법에 따라 다음과 같은 차이가있었습니다.

1. Power BI의 테이블 입력 메뉴에 Excel 테이블을 그대로 붙여 넣습니다.
⇒셀내 개행은 #(cr,lf) 가 된다.

2.동 메뉴에 손 입력으로, shift+enter로 개행.
⇒개행은 #(lf) 가 된다.

3. Excel 테이블에서 Power Query로로드
⇒셀내 개행은 #(lf) 가 된다.

따라서 위 코드의 "대체 문자 목록"에서는 둘 다 대체합니다.
대체 순서도 중요합니다. 왜냐하면, #(cr,lf) 로 들어가 있는 개행에 대해서, #(lf) 만 치환된다고 하는 것이 일어나기 때문입니다.
즉,
//trueになる
= Text.Replace("a#(cr,lf)bc","#(lf)","") ="a#(cr)bc" 

된다.
그럼, 좌변이 실시한 내용은 어떻게 되는가 하면,

라고 보기, 개행이 잡힌 바람으로 보인다. 그러나 이것을 메모장에 붙이면,


라는 상태로 #(cr) 가 남아 있는 것을 알 수 있다.
여기까지 눈치채는데, 고민해 버렸습니다.

공식 정보에서는 Power Query M language specification 의 2.6.1 Character Escape Sequences를 읽는 것이 좋습니다. (영어)

함수화된 코드



스스로 사용해 보고, 데이터형 변환이 없는 것은 불편하게 생각했으므로, 그것도 넣어 함수화해 두었습니다.
(tbl as table)=>
let
    データ型をテキストに変換 = Table.TransformColumnTypes(tbl,
                           List.Transform( Table.ColumnNames(tbl),each {_,type text} )
                         ),
    置換文字リスト = {{"#(cr,lf)","<br>"},{"#(lf)","<br>"},{"|","&#124;"}},
    置換用関数 =(文字列のリスト as list)=>
                    List.Transform(文字列のリスト,each 
                        List.Accumulate(
                            置換文字リスト,_,(x,y)=>Text.Replace(x,y{0},y{1})
                        )
                    ),
    タイトル = "|" & Text.Combine( 置換用関数(Table.ColumnNames(データ型をテキストに変換)),"|" ) &"|",
    タイトル下 = "|---"& Text.Repeat( "|---",Table.ColumnCount(データ型をテキストに変換)-1 ) &"|",

    中身 = Text.Combine( List.Transform(
                            Table.ToRows(データ型をテキストに変換),
                            each "|" & Text.Combine(置換用関数(_),"|") & "|"
                         ),"#(lf)"
           ),
    合成 = Text.Combine({タイトル,タイトル下,中身},"#(lf)")
in
    合成

좋은 웹페이지 즐겨찾기