Archive for: 𔃴月 2019’

Elixir で縦持ちデータ⇒横持ちデータへフォーマット変換

2019年4月30日 Posted by PURGE

ファイルのデータ構造を、縦持ちから横持ちに使用と思い、大量データなのでExcelでは無理、Pandasを使用しようと思ったが挫けた。そこで、久しぶりにElixirで処理を書いてみた。

元ファイル(.tsv)

1	Bob	Elixir
1	Bob	Java
1	Bob	Ruby
2	Tom	Elixir
2	Tom	C#
3	Dave	Python
3	Dave	Java
3	Dave	Ruby
4	Jane	Python

整形後ファイル (.tsv)

1	Bob	Elixir	Java	Ruby
2	Tom	Elixir	C#	
3	Dave	Python	Java	Ruby
4	Jane	Python		
defmodule FormatTsv do
  def convert do
    headers = [:id, :name, :lang]
    out_file = "out.tsv"
    result = "data.tsv"
      |> File.stream!
      |> CSV.decode(separator: ?\t, headers: headers)
      |> Enum.map(&(elem(&1, 1)))
      |> Enum.group_by(fn(x)-> x[:id] end)
      |> Enum.map(fn {id, values} -> 
                    "#{id}\t#{Enum.at(values, 0)[:name]}\t#{Enum.at(values, 0)[:lang]}\t#{Enum.at(values, 1)[:lang]}\t#{Enum.at(values, 2)[:lang]}\n"
                  end)
    File.write(out_file, result)
  end
end

できてしまうと、お気軽で楽しいElixirである。

Elixir の Enum.group_by

2019年4月29日 Posted by PURGE

Elixir の Enum.group_by の使用方法にもやもやしていたので覚え書き。

["Elixir","Java","C#","Python","Ruby"]
  |> Enum.group_by(fn(x)-> String.length x end)


iex(1)> FormatTsv.test
%{2 => ["C#"], 4 => ["Java", "Ruby"], 6 => ["Elixir", "Python"]}

出力例を見てわかるように、リストの要素に対して、関数 fn で 返却した値で、グループ化している。