Slide 4
Slide 4 text
3
Enum.map/reduceが、かなりイイ具合
大抵のデータ処理は、この2つと、filter/sortをパイプで繋げば、
ほぼ完結と、シンプルで強力過ぎるのが、Elixir最大の魅力です
defmodule DataCleansing do
def run( filename ) do
filename
|> File.stream!
# データクレンジング
|> Flow.map( & String.replace( &1, ",", "¥t" ) ) # ①CSV→TSV
|> Flow.map( & String.replace( &1, "¥r¥n", "¥n" ) ) # ②CRLF→LF
|> Flow.map( & String.replace( &1, "¥"", "" ) ) # ③ダブルクォート外し
# 集計
|> Enum.map( & &1 |> String.split( "¥t" ) ) # ④タブで分割
|> Enum.map( fn [ _head | tail ] -> tail |> List.first end ) # ⑤2番目の項目を抽出
|> Enum.reduce( %{}, fn name, acc -> # ⑥同値の出現数を集計
Map.update( acc, name, 1, &( &1 + 1 ) ) end )
|> Enum.sort( & elem( &1, 1 ) > elem( &2, 1 ) ) # ⑦多い順でソート
end
end