Elixir:
Trabalhando com CSV

Como Fazer:

Elixir, com sua poderosa correspondência de padrões e suporte para encadeamento (pipelining), pode manejar arquivos CSV de forma eficiente, mesmo sem bibliotecas de terceiros. Contudo, para necessidades mais avançadas, a biblioteca nimble_csv é uma opção rápida e direta.

Lendo um Arquivo CSV Sem Bibliotecas Externas

Você pode ler e analisar um arquivo CSV usando as funções internas do Elixir:

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

# Exemplo de uso
CSVReader.read_file("data.csv")
# Saída: [["Cabeçalho1", "Cabeçalho2"], ["ValorLinha1", "ValorLinha2"], ["ValorLinha2", "ValorLinha2"]]

Escrevendo em um Arquivo CSV

Similarmente, para escrever dados em um arquivo 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

# Exemplo de uso
dados = [["Cabeçalho1", "Cabeçalho2"], ["Valor1", "Valor2"], ["Valor3", "Valor4"]]
CSVWriter.write_to_file("saida.csv", dados)
# Cria saida.csv com os dados formatados como CSV

Usando nimble_csv

Para manipulações de CSV mais complexas, nimble_csv proporciona uma maneira poderosa e flexível de trabalhar com dados CSV. Primeiro, adicione nimble_csv às suas dependências em mix.exs e execute mix deps.get:

defp deps do
  [
    {:nimble_csv, "~> 1.2"}
  ]
end

Analisando dados CSV com nimble_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

# Exemplo de uso
MyCSVParser.parse("data.csv")
# A saída com nimble_csv pode ser personalizada com base na definição, mas geralmente se parece com uma lista de listas ou tuplas, dependendo de como você configurou seu analisador.

Escrever dados CSV usando nimble_csv requer transformar manualmente seus dados em um formato apropriado e então escrevê-los em um arquivo, muito como o exemplo em Elixir puro, mas aproveitando o nimble_csv para gerar linhas CSV formatadas corretamente.

Escolhendo a abordagem apropriada para a complexidade da sua tarefa, você pode manipular arquivos CSV em Elixir com grande flexibilidade e poder.