大CSV将生成零字节输出

时间:2017-07-20 09:23:53

标签: csv elixir

我正在运行以下代码来读取CSV,处理并将输出写回CSV。我的目标是读取一个大文件(26k行,多行和13mb)。 当我运行40或500行的样本数据时,我的输出就可以了。 但是当我运行整个数据时,我的输出是一个零字节文件。

我在Mac上使用Elixir(version 1.4)(10.11.6)。

现在代码:

# mix.exs

defp deps do
  [{:nimble_csv, "~> 0.1.0"},
  {:flow, "~> 0.11"}]
end

# csv.ex

defmodule Csv do

  NimbleCSV.define(MyParser, separator: ",", escape: "\"")

  def run(file) do

    {headers, output} = config_data()

    file
    |> File.stream!
    |> MyParser.parse_stream
    |> Flow.from_enumerable
    |> Flow.map( fn x -> Enum.zip(headers, x) end)
    |> Flow.map(&each_line(&1))
    |> MyParser.dump_to_stream
    |> Enum.into(output)

  end

  defp config_data() do
    [headers | _]  = File.read!("headers.csv")
    |> MyParser.parse_string(headers: false)

    output = File.stream!("output.csv")

    {headers, output}
  end

  defp each_line(line) do
    line
    |> Enum.filter_map(&item_filter(&1), &item_map(&1))
  end

  defp item_filter({"Grand Total", _count}), do: false
  defp item_filter({_exam, count}) do
    if(count == "", do: false, else: true)
  end

  defp item_map({"client", count}), do: count
  defp item_map({exam, _count}), do: exam
end

0 个答案:

没有答案