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에 해당하는 줄만 유지하도록 각 줄을 필터링합니다. 마지막으로 라인 요소를 구조화 된 데이터 맵에 저장합니다. 하지만 이제 필터 라인의 이름 만 인쇄하는 방법은 여기 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"}]
그러나 이제이 주제를 끝내기 위해 예를 들어 설명에 액세스하여 저장하겠습니다. 그 방법을 모르겠습니다. 마지막으로이 데이터를 표시합니다.
중간 변수를 생성하는 단계에서, 중복 엘릭시르 우리가 Kernel.|>/2
파이프 다음 함수의 첫 번째 인수 기능 '을 출력 일명 관 연산자.
"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에 완전히 익숙하다고 느낄 때 매핑을 병렬화 하는 Flow
대신 사용할 수 있습니다 Stream
. 지금은 (그리고 비교적 작은 파일의 경우) Stream
충분합니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다