Elixir:如何显示结构化数据元素?

Elixir : how to display a structured data element?

我正在尝试解析 CSV 文件。其实我有这个代码:

alias NimbleCSV.RFC4180, as: CSV

defmodule Siren do
  def parseCSV do
    IO.puts("Let's parse CSV file!")

    stream = File.stream!("name.csv")
    original_line = CSV.parse_stream(stream)
    filter_line = Stream.filter(original_line, fn
      ["JeremyGuthrie" | _] -> true
      _ -> false
    end)
    map = Stream.map(filter_line,
    fn [name, team, position, height, weight, age] ->
      %{name: name, team: team, position: position,
      height: String.to_integer(height),
      weight: String.to_integer(weight),
      age: Float.parse(age) |> elem(0)
      }
    end)
  end
end

根据我的观点,我构建了一个流来处理我的 name.csv 文件的每一行。使用 NimbleCSV 库,我解析了这一行并避免了 header 行。然后,我过滤每一行,只保留与 JeremyGuthrie 对应的那一行。最后,我将线元素存储到结构化数据图中。但是现在如何只打印我的过滤器行的名称:这里是 JeremyGuthrie。

我还有一个问题:我在根据年龄、身高或体重等数字过滤我的信息流时遇到了一些问题。

在这里,我将 Aleksei 的建议应用到另一个代码中:

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

defmodule Siren do
  def parseCSV do
    IO.puts("Let's parse CSV file!")

    "ActeursEOF.csv"
    |> File.stream!()
    |> MyParser.parse_stream()
    |> Stream.filter(fn
      ["RAZEL BEC" | _] -> true
      ["" | _] -> false
      _ -> false
    end)
    |> Stream.map(fn [name, description, enr_competences] ->
      %{name: name, description: description, enr_competences: enr_competences}
    end)
    |> Enum.to_list()
    |> IO.inspect()
  end
end

我的输出:

Compiling 1 file (.ex)
Let's parse CSV file!
[%{description: "Génie Civil", enr_competences: "Oui", name: "RAZEL BEC"}]

但现在要结束这个主题,我会访问并存储例如描述。我不知道该怎么做...最后显示此数据。

生成中间变量是多余的,在 we have Kernel.|>/2 aka pipe operator 中将函数的输出通过管道传递给下一个函数的第一个参数。

"name.csv"
|> File.stream!()
|> CSV.parse_stream()
|> Stream.filter(fn
  ["JeremyGuthrie" | _] -> true
  _ -> false
end)
|> Stream.map(fn
  [name, team, position, height, weight, age] ->
    %{name: name, team: team, position: position,
      height: String.to_integer(height),
      weight: String.to_integer(weight),
      age: Float.parse(age) |> elem(0)
    }
end)
|> Enum.to_list() # THIS

注意链中的最后一行。流将 终止 以检索结果。在终止发生之前,它是惰性构造的,但根本不求值。这使得例如生产和运营无限流。

Enum 模块中的任何贪心函数都可以:Enum.take/2,或者,正如我上面指出的,Enum.to_list/1.


供参考,以后觉得完全熟悉的时候用, you might use Flow代替Stream来并行映射。现在(以及相对较小的文件)Stream 已经足够了。