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

Csv Elixir:如何显示结构化数据元素?,csv,erlang,elixir,Csv,Erlang,Elixir,我正在尝试解析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_lin

我正在尝试解析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库,我解析这一行并避开标题行。然后,我过滤每一行,只保留与JeremyGuthrie对应的一行。最后,我将line元素存储到结构化数据映射中。但是现在如何打印我的过滤线的名称:这里是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"}]

但是现在要结束这个主题,我想访问并储存一些描述。我不知道该怎么做。。。最后显示这些数据。

生成中间变量是多余的,因为我们有一个管道操作符,将函数的输出管道到下一个函数的第一个参数

name.csv |>File.stream! |>CSV.parse_流 |>Stream.filterfn [JeremyGuthrie | |]->正确 _->错误 终止 |>Stream.mapfn [姓名、团队、职位、身高、体重、年龄]-> %{name:name,team:team,position:position, 高度:String.to_整数, 重量:String.to_整数重量, 年龄:Float.parseage |>elem0 } 终止 |>Enum.to_列出此 注意链中的最后一行。要终止流以检索结果。在终止发生之前,它是惰性构造的,但根本不进行评估。这使得生产和运营无限流成为可能

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


为了便于参考,将来当您完全熟悉时,您可能会使用Stream而不是Stream来并行化映射。目前,对于相对较小的文件,流已经足够好了。

生成中间变量是多余的,因为我们有一个管道操作符,用于将函数的输出管道化到下一个函数的第一个参数

name.csv |>File.stream! |>CSV.parse_流 |>Stream.filterfn [JeremyGuthrie | |]->正确 _->错误 终止 |>Stream.mapfn [姓名、团队、职位、身高、体重、年龄]-> %{name:name,team:team,position:position, 高度:String.to_整数, 重量:String.to_整数重量, 年龄:Float.parseage |>elem0 } 终止 |>Enum.to_列出此 注意链中的最后一行。要终止流以检索结果。在终止发生之前,它是惰性构造的,但根本不进行评估。这使得生产和运营无限流成为可能

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


为了便于参考,将来当您完全熟悉时,您可能会使用Stream而不是Stream来并行化映射。对于现在和相对较小的文件,Stream已经足够好了。

后一种CSV使用分号作为分隔符;为此,您需要生成自己的解析器,因为标准的解析器需要逗号。我只对您的建议做出上面的反应,而不是您上次的映射,执行您想要的操作:Stream.mapfn[\u name,description,\u enr\u capabilities]->description end。啊,我将尝试让您返回映射列表。Enum.maplist、&&1.description将内容映射到描述等;为此,您需要生成自己的解析器,因为标准的解析器需要逗号。我只对您的建议做出上面的反应,而不是您上次的映射,执行您想要的操作:Stream.mapfn[\u name,description,\u enr\u capabilities]->description end。啊,我将尝试让您返回映射列表。Enum.maplist和&1.description会将内容映射到描述等。