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"}]
但现在要结束这个主题,我会访问并存储例如描述。我不知道该怎么做...最后显示此数据。
生成中间变量是多余的,在 elixir 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
.
供参考,以后觉得完全熟悉的时候用elixir, you might use Flow
代替Stream
来并行映射。现在(以及相对较小的文件)Stream
已经足够了。
我正在尝试解析 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"}]
但现在要结束这个主题,我会访问并存储例如描述。我不知道该怎么做...最后显示此数据。
生成中间变量是多余的,在 elixir 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
.
供参考,以后觉得完全熟悉的时候用elixir, you might use Flow
代替Stream
来并行映射。现在(以及相对较小的文件)Stream
已经足够了。