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である。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です