ファイルのデータ構造を、縦持ちから横持ちに使用と思い、大量データなので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である。