Csv Elixir:如何显示结构化数据元素?
我正在尝试解析CSV文件。实际上我有这个代码: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
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会将内容映射到描述等。