为什么流在此iex会话中阻塞?

时间:2016-01-18 17:24:24

标签: csv elixir

我正在尝试使用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解析。

1 个答案:

答案 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