我正在运行以下代码来读取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