我正在尝试使用elixir解析一些CSV:
iex -S mix
Erlang/OTP 18 [erts-7.2] [source-e6dd627] [64-bit] [smp:4:4] [async-threads:10] [hipe] [kernel-poll:false]
Interactive Elixir (1.3.0-dev) - press Ctrl+C to exit (type h() ENTER for help)
iex(1)> a = File.stream!("test/lib/fit_notes/fit_notes_export.csv") |> CSV.decode
#Function<49.97003610/2 in Stream.transform/3>
iex(2)> Stream.take(a, 1)
#Stream<[enum: #Function<49.97003610/2 in Stream.transform/3>,
funs: [#Function<38.97003610/1 in Stream.take/2>]]>
iex(3)> Enum.take(a, 1)
[["Date", "Exercise", "Category", "Weight (kgs)", "Reps", "Distance",
"Distance Unit", "Time"]]
iex(4)> Enum.take(a, 2)
^ this just blocks
我发行的第一个Enum.take
,第二个永久阻止。你能告诉我我做错了什么吗?我正在使用this library进行CSV解析。
答案 0 :(得分:1)
如果您按照http://hexdocs.pm/csv/CSV.html中的示例进行操作 你的代码最终会是这样的:
a = File.stream!("test/lib/fit_notes/fit_notes_export.csv") |> CSV.decode |>
Stream.take(1) |>
Stream.take(1) |>
Enum.take(2)
注意我将您的第一个Enum.take(1)
更改为Stream.take(1)
,以便Stream不会过早终止。另请注意,执行两个Stream.take(1)
将更好地转换为单个Stream.take(2)
。还要注意添加|&gt;流管道的工作原理。到达每一行的末尾,直到你达到一个Enum调用 - 然后激活整个操作。
加了: 对于具有副作用的Streams(如日志记录),请参阅 https://github.com/elixir-lang/elixir/issues/1831他们推荐Stream.each