PowerApps에서 CSV 로그를 읽고 집계하여 CSV로 정형하여 표시시킨다.

6267 단어 PowerApps

소개



PowerApps에서 문자열 조작 연습을 하기 위해 FW 로그를 집계해 보았습니다.
실용성은 없을 것 같습니다.

하고 싶은 일



다음과 같은 로그가 있었을 경우에, 10분 단락의 같은 시각에 있어서, 포트 마다의, 전송 Byte수를 산출한다
'Receive Time'      , 'Destination Port' , 'Bytes'
2020/04/01 10:13:00 ,  22                , 100
2020/04/01 10:15:00 ,  22                , 120
2020/04/01 10:43:00 ,  23                ,  30
2020/04/01 10:45:00 , 445                , 300
2020/04/01 10:48:00 ,  23                ,  80
2020/04/01 10:49:00 ,  22                ,  90


'Receive Time'
'Destination Port'
'Bytes'


2020/04/01 10:13:00
22
100

2020/04/01 10:15:00
22
120

2020/04/01 10:43:00
23
30

2020/04/01 10:45:00
445
300

2020/04/01 10:48:00
23
80

2020/04/01 10:49:00
22
90


이것을 다음과 같이 표시하고 싶습니다.
LOG , 10:1X , 10:4X
 22 ,   220 ,   90
 23 ,       ,  110
445 ,       ,  300


LOG
10:1X
10:4X


22
220
90

23

110

445

300


화면 준비



원본 로그를 표시하는 라벨, 집계 로그를 표시하는 라벨, 집계 버튼 배치

원본 로그를 표시하는 라벨

もとのデータソースをカラムごとに表示させるだけです。

元ログを表示するラベル.Text
Concat(ColDataSource,'Receive Time'&","&'Destination Port'&","&Bytes,Char(13)&Char(10))

집계 로그를 표시하는 레이블

集計ボタンで処理した結果を表示させるだけです。

集計ログを表示するラベル.Text
strLog

집계 처리를 수행하는 버튼

ボタンが押されると処理が走ります。

集計処理を行うボタン.OnSelect
// 本チャンのデータソースを読み込む場合は、適当なコネクタを入れて、データを読み込みます。
// 今回はテスト表示なので、コメント
// ClearCollect(ColDataSource,[@FWlog])

// テスト用のログを設定
ClearCollect(ColDataSource,Table( { 'Receive Time': DateTimeValue("2020/04/01 10:13:00") , 'Destination Port': "22" , 'Bytes': 100 }, { 'Receive Time': DateTimeValue("2020/04/01 10:15:00") , 'Destination Port': "22" , 'Bytes': 120 }, { 'Receive Time': DateTimeValue("2020/04/01 10:43:00") , 'Destination Port': "23" , 'Bytes': 30 }, { 'Receive Time': DateTimeValue("2020/04/01 10:45:00") , 'Destination Port': "445" , 'Bytes': 300 }, { 'Receive Time': DateTimeValue("2020/04/01 10:48:00") , 'Destination Port': "23" , 'Bytes': 80 }, { 'Receive Time': DateTimeValue("2020/04/01 10:49:00") , 'Destination Port': "22" , 'Bytes': 90 } ))

//
// 集計対象とするデータソースを、以下の4つのカラムを持つコレクションにコピーします
//   COLUMN    : 横方向の要素(この場合、'Receive Time'の YYYY/MM/DD hh:mm:ss のうち、時刻の部分の先頭4バイト分、 )
//   ROW       : 縦方向の要素(この場合、'Destication Port')
//   VALUE     : 集計対象にする数値(この場合、'Bytes')
//   SUM_TARGET: 集計対象を判断するための仮のカラム(COLUMNとROWをカンマ区切りにする)
//
;ClearCollect( ColLog, 
               ForAll( ColDataSource,{ 
                                      COLUMN:     Left(Text('Receive Time',ShortTime24),4)&"X" ,
                                      ROW:        Text('Destination Port'),
                                      VALUE:      Value('Bytes'),
                                      SUM_TARGET: Left(Text('Receive Time',ShortTime24),4)&"X"&","&Text('Destination Port')
                                     }
               ) 
)

// ColLog_ALL_ROWs
// 期間中の行方向の全成分を単一列にまとめる
// ログに存在しない行方向の成分を含める場合は、ここに追加する
;ClearCollect( ColTemp,ForAll(ColLog,{ROW:ROW}))
;ClearCollect( ColLog_ALL_ROWs,
               SortByColumns( 
                   RenameColumns( Distinct(ColTemp,ROW) , "Result" , "ROW_check") ,
                   "ROW_check"
               )
)

// ColLog_ALL_COLUMNs
// 期間中の列方向の全成分を単一列にまとめる
// ログに存在しない列方向の成分を含める場合は、ここに追加する
;ClearCollect( ColTemp,ForAll(ColLog,{COLUMN:COLUMN}))
;ClearCollect( ColLog_ALL_COLUMNs, 
               SortByColumns( 
                   RenameColumns( Distinct(ColTemp,COLUMN) , "Result" , "COLUMN_check") ,
                   "COLUMN_check"
               )
)

// ColLog_VALUEsum_PER_COLUMNs
// VALUEを合算したい対象カラム(SUM_TARGET)をグループ化して、SUMる
;ClearCollect( ColLog_VALUEsum_PER_COLUMNs, 
               AddColumns( GroupBy(ColLog,"SUM_TARGET","GROUP_SUM_TARGET"),
                           "TOTAL VALUE PER COLUMN" , Sum( GROUP_SUM_TARGET, VALUE ) ,
                           "COLUMN"                 , First(Split(SUM_TARGET,",")).Result ,
                           "ROW"                    ,  Last(Split(SUM_TARGET,",")).Result
              )
)

// strLogに吐き出す
;Set(strLog,
  // 最初の行はヘッダ
  "LOG,"&Concat(ColLog_ALL_COLUMNs,COLUMN_check,",")&Char(13)&Char(10)&
  // 行方向でループさせつつ、
  Concat(ColLog_ALL_ROWs,
  // -------------------> 列方向でループさせ
         ROW_check & ","& Concat(ColLog_ALL_COLUMNs, 
  // --------------------------> 行&列が合致した集計済数値を表示させる
                                 Text( LookUp(ColLog_VALUEsum_PER_COLUMNs,ROW=ROW_check&&COLUMN=COLUMN_check).'TOTAL VALUE PER COLUMN'),
                                 "," ) , 
         Char(13)&Char(10)
  )
)

사이고에게

これを、「CSVで出力」できるとうれしいのですが、Export/Importの機能は、コレクションをPowerAppsアプリ同士で交換するための機能のようで、強制的にJSONになっちゃうんですね。

単純なループの処理ができないので、とっても文字列操作がやりにくいですね。
果たしてこんな処理をPowerAppsの中でやる意味はあるのか。。。
まぁ、練習です。

좋은 웹페이지 즐겨찾기