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_csvmix.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ファイルを非常に柔軟かつ強力に扱うことができます。