Elixir:
CSVとの作業
方法:
Elixirは、強力なパターンマッチングとパイプラインのサポートを備えているため、サードパーティのライブラリなしでもCSVファイルを効率的に扱うことができます。しかし、より高度なニーズに対しては、nimble_csv
ライブラリが速くて簡潔な選択肢です。
外部ライブラリなしでCSVファイルを読む
Elixirの組み込み関数を使用してCSVファイルを読み取り、解析することができます:
defmodule CSVReader do
def read_file(file_path) do
File.stream!(file_path)
|> Stream.map(&String.trim_trailing/1)
|> Stream.map(&String.split(&1, ","))
|> Enum.to_list()
end
end
# サンプル使用法
CSVReader.read_file("data.csv")
# 出力: [["Header1", "Header2"], ["Row1Value1", "Row1Value2"], ["Row2Value1", "Row2Value2"]]
CSVファイルに書き込む
同様に、CSVファイルにデータを書き込むには:
defmodule CSVWriter do
def write_to_file(file_path, data) do
File.open(file_path, [:write], fn file ->
Enum.each(data, fn row ->
IO.write(file, Enum.join(row, ",") <> "\n")
end)
end)
end
end
# サンプル使用法
data = [["Header1", "Header2"], ["Value1", "Value2"], ["Value3", "Value4"]]
CSVWriter.write_to_file("output.csv", data)
# CSV形式のデータを含むoutput.csvを作成
nimble_csv
の使用
より複雑なCSVの扱いには、nimble_csv
はCSVデータを扱うための強力で柔軟な方法を提供します。まず、nimble_csv
をmix.exs
の依存関係に追加し、mix deps.get
を実行します:
defp deps do
[
{:nimble_csv, "~> 1.2"}
]
end
nimble_csv
でCSVデータを解析:
defmodule MyCSVParser do
NimbleCSV.define(MyParser, separator: ",", escape: "\\")
def parse(file_path) do
file_path
|> File.stream!()
|> MyParser.parse_stream()
|> Enum.to_list()
end
end
# サンプル使用法
MyCSVParser.parse("data.csv")
# nimble_csvを使用した出力は、パーサーの設定によりますが、一般的にはリストのリストやタプルのように見えます。
nimble_csv
を使用してCSVデータを書き込むには、データを適切な形式に手動で変換してからファイルに書き込む必要があります。これはプレインなElixirの例と似ていますが、正しくフォーマットされたCSV行を生成するためにnimble_csv
を活用しています。
タスクの複雑さに適したアプローチを選択することで、ElixirでCSVファイルを非常に柔軟かつ強力に扱うことができます。