Я пытаюсь разобрать текстовый файл [результат запроса откуда-то еще] на карту. Моя проблема в том, что я всегда получаю только три предмета на карте. на карте около 30 элементов, и проверка показывает, что они проанализированы. Насколько я вижу, они выглядят нормально...
У меня есть следующий модуль, определенный в Эликсире:
defmodule Statistics do
def read(path) do
case File.read(path) do
{:ok, body} ->
parse_body body
{:error, reason} ->
IO.puts(~s(could not open file "#{path}"\n))
IO.puts(~s("#{:file.format_error(reason)}"\n))
end
end
def parse_lines(lines, keys) do
Enum.reduce(lines, %{}, fn line, built ->
[name | fields] = String.split(line, "\t")
# IO.inspect(fields)
if Enum.count(keys) == Enum.count(fields) do
line_data = Enum.zip(keys, fields) |> Enum.into(%{})
Map.merge(built, %{name => line_data})
else
built
end
end)
end
def parse_body(body) do
[header | lines] = String.split(body, ~r(\r\n|\r|\n))
keys = tl String.split(header, "\t")
parse_lines(lines, keys)
end
end
У меня также есть текстовый файл со следующим содержимым:
Abandon_agent Abandon_system answered_greater_than_20 answered_less_than_20 answered_less_than_15 answered_less_than_10 answered_less_than_5 date
0 0 0 0 0 0 0 2022-09-29
0 0 0 0 0 0 0 2022-10-01
0 0 0 0 0 0 0 2022-10-02
0 0 0 0 4 24 9 2022-10-03
0 0 2 0 6 22 23 2022-10-04
2 0 0 0 7 16 21 2022-10-05
1 0 1 0 8 12 35 2022-10-06
0 0 0 2 8 9 29 2022-10-07
0 0 0 0 0 0 0 2022-10-08
0 0 0 0 0 0 0 2022-10-09
0 0 2 3 3 18 12 2022-10-10
0 0 1 2 5 16 6 2022-10-11
0 0 0 2 6 24 19 2022-10-12
0 0 1 2 3 20 29 2022-10-13
1 0 1 2 2 11 10 2022-10-14
0 0 0 0 0 0 0 2022-10-15
0 0 0 0 0 0 0 2022-10-16
0 0 1 1 6 17 11 2022-10-17
0 0 1 1 4 16 11 2022-10-18
0 0 0 1 7 18 12 2022-10-19
0 0 1 1 6 21 9 2022-10-20
1 0 0 3 1 20 17 2022-10-21
0 0 0 0 0 0 0 2022-10-22
0 0 0 0 0 0 0 2022-10-23
0 0 1 1 9 37 15 2022-10-24
0 0 0 1 4 21 14 2022-10-25
1 0 1 2 0 21 12 2022-10-26
0 0 3 2 7 17 13 2022-10-27
0 0 1 0 1 9 27 2022-10-28
0 0 0 0 0 0 0 2022-10-29
0 0 0 0 0 0 0 2022-10-30
0 0 0 0 4 21 8 2022-10-31
Несмотря на то, что проверка показывает проанализированные данные, Я всегда получаю только это:
%{
"0" => %{
"Abandon_system" => "0",
"answered_greater_than_20" => "0",
"answered_less_than_10" => "21",
"answered_less_than_15" => "4",
"answered_less_than_20" => "0",
"answered_less_than_5" => "8",
"date" => "2022-10-31"
},
"1" => %{
"Abandon_system" => "0",
"answered_greater_than_20" => "1",
"answered_less_than_10" => "21",
"answered_less_than_15" => "0",
"answered_less_than_20" => "2",
"answered_less_than_5" => "12",
"date" => "2022-10-26"
},
"2" => %{
"Abandon_system" => "0",
"answered_greater_than_20" => "0",
"answered_less_than_10" => "16",
"answered_less_than_15" => "7",
"answered_less_than_20" => "0",
"answered_less_than_5" => "21",
"date" => "2022-10-05"
}
}
Просто для полноты проверка полей [parsed] показывает следующее: [все данные]. Я неправильно использую zip?
[Statistics]
iex(107)> records = Statistics.read "/home/joe/projects/playland_elixir/statistics/lib/by_date.txt"
["0", "0", "0", "0", "0", "0", "2022-09-29"]
["0", "0", "0", "0", "0", "0", "2022-10-01"]
["0", "0", "0", "0", "0", "0", "2022-10-02"]
["0", "0", "0", "4", "24", "9", "2022-10-03"]
["0", "2", "0", "6", "22", "23", "2022-10-04"]
["0", "0", "0", "7", "16", "21", "2022-10-05"]
["0", "1", "0", "8", "12", "35", "2022-10-06"]
["0", "0", "2", "8", "9", "29", "2022-10-07"]
["0", "0", "0", "0", "0", "0", "2022-10-08"]
["0", "0", "0", "0", "0", "0", "2022-10-09"]
["0", "2", "3", "3", "18", "12", "2022-10-10"]
["0", "1", "2", "5", "16", "6", "2022-10-11"]
["0", "0", "2", "6", "24", "19", "2022-10-12"]
["0", "1", "2", "3", "20", "29", "2022-10-13"]
["0", "1", "2", "2", "11", "10", "2022-10-14"]
["0", "0", "0", "0", "0", "0", "2022-10-15"]
["0", "0", "0", "0", "0", "0", "2022-10-16"]
["0", "1", "1", "6", "17", "11", "2022-10-17"]
["0", "1", "1", "4", "16", "11", "2022-10-18"]
["0", "0", "1", "7", "18", "12", "2022-10-19"]
["0", "1", "1", "6", "21", "9", "2022-10-20"]
["0", "0", "3", "1", "20", "17", "2022-10-21"]
["0", "0", "0", "0", "0", "0", "2022-10-22"]
["0", "0", "0", "0", "0", "0", "2022-10-23"]
["0", "1", "1", "9", "37", "15", "2022-10-24"]
["0", "0", "1", "4", "21", "14", "2022-10-25"]
["0", "1", "2", "0", "21", "12", "2022-10-26"]
["0", "3", "2", "7", "17", "13", "2022-10-27"]
["0", "1", "0", "1", "9", "27", "2022-10-28"]
["0", "0", "0", "0", "0", "0", "2022-10-29"]
["0", "0", "0", "0", "0", "0", "2022-10-30"]
["0", "0", "0", "4", "21", "8", "2022-10-31"]
[]





Проблема в том, что вы используете первый столбец в качестве ключа к карте. В картах может быть только один из каждого ключа. Поскольку у вас есть только три уникальных значения (0, 1, 2) в первом столбце, только последнее вхождение каждого из них выживает после вашего вызова reduce.
Вот пример, который возвращает пары (ключ, значение) в виде кортежа, где вы можете увидеть повторяющиеся ключи, которые заменяются в вашем коде.
def parse_lines(lines, keys) do
Enum.map(lines, fn line ->
[name | fields] = String.split(line, "\t")
line_data = Enum.zip(keys, fields) |> Enum.into(%{})
{name, line_data}
end)
end
Результат:
[
{"0",
%{
"Abandon_system" => "0",
"answered_greater_than_20" => "0",
"answered_less_than_10" => "0",
"answered_less_than_15" => "0",
"answered_less_than_20" => "0",
"answered_less_than_5" => "0",
"date" => "2022-09-29"
}},
{"0",
%{
"Abandon_system" => "0",
"answered_greater_than_20" => "0",
"answered_less_than_10" => "0",
"answered_less_than_15" => "0",
"answered_less_than_20" => "0",
"answered_less_than_5" => "0",
"date" => "2022-10-01"
}},
{"0",
%{
"Abandon_system" => "0",
"answered_greater_than_20" => "0",
"answered_less_than_10" => "0",
"answered_less_than_15" => "0",
"answered_less_than_20" => "0",
"answered_less_than_5" => "0",
"date" => "2022-10-02"
}},
{"0",
%{
"Abandon_system" => "0",
"answered_greater_than_20" => "0",
"answered_less_than_10" => "24",
"answered_less_than_15" => "4",
"answered_less_than_20" => "0",
"answered_less_than_5" => "9",
"date" => "2022-10-03"
}},
{"0",
%{
"Abandon_system" => "0",
"answered_greater_than_20" => "2",
"answered_less_than_10" => "22",
"answered_less_than_15" => "6",
"answered_less_than_20" => "0",
"answered_less_than_5" => "23",
"date" => "2022-10-04"
}},
{"2",
%{
"Abandon_system" => "0",
"answered_greater_than_20" => "0",
"answered_less_than_10" => "16",
"answered_less_than_15" => "7",
"answered_less_than_20" => "0",
"answered_less_than_5" => "21",
"date" => "2022-10-05"
}},
{"1",
%{
"Abandon_system" => "0",
"answered_greater_than_20" => "1",
"answered_less_than_10" => "12",
"answered_less_than_15" => "8",
"answered_less_than_20" => "0",
"answered_less_than_5" => "35",
"date" => "2022-10-06"
}},
{"0",
%{
"Abandon_system" => "0",
"answered_greater_than_20" => "0",
"answered_less_than_10" => "9",
"answered_less_than_15" => "8",
"answered_less_than_20" => "2",
"answered_less_than_5" => "29",
"date" => "2022-10-07"
}},
{"0",
%{
"Abandon_system" => "0",
"answered_greater_than_20" => "0",
"answered_less_than_10" => "0",
"answered_less_than_15" => "0",
"answered_less_than_20" => "0",
"answered_less_than_5" => "0",
"date" => "2022-10-08"
}},
{"0",
%{
"Abandon_system" => "0",
"answered_greater_than_20" => "0",
"answered_less_than_10" => "0",
"answered_less_than_15" => "0",
"answered_less_than_20" => "0",
"answered_less_than_5" => "0",
"date" => "2022-10-09"
}},
{"0",
%{
"Abandon_system" => "0",
"answered_greater_than_20" => "2",
"answered_less_than_10" => "18",
"answered_less_than_15" => "3",
"answered_less_than_20" => "3",
"answered_less_than_5" => "12",
"date" => "2022-10-10"
}},
{"0",
%{
"Abandon_system" => "0",
"answered_greater_than_20" => "1",
"answered_less_than_10" => "16",
"answered_less_than_15" => "5",
"answered_less_than_20" => "2",
"answered_less_than_5" => "6",
"date" => "2022-10-11"
}},
{"0",
%{
"Abandon_system" => "0",
"answered_greater_than_20" => "0",
"answered_less_than_10" => "24",
"answered_less_than_15" => "6",
"answered_less_than_20" => "2",
"answered_less_than_5" => "19",
"date" => "2022-10-12"
}},
{"0",
%{
"Abandon_system" => "0",
"answered_greater_than_20" => "1",
"answered_less_than_10" => "20",
"answered_less_than_15" => "3",
"answered_less_than_20" => "2",
"answered_less_than_5" => "29",
"date" => "2022-10-13"
}},
{"1",
%{
"Abandon_system" => "0",
"answered_greater_than_20" => "1",
"answered_less_than_10" => "11",
"answered_less_than_15" => "2",
"answered_less_than_20" => "2",
"answered_less_than_5" => "10",
"date" => "2022-10-14"
}},
{"0",
%{
"Abandon_system" => "0",
"answered_greater_than_20" => "0",
"answered_less_than_10" => "0",
"answered_less_than_15" => "0",
"answered_less_than_20" => "0",
"answered_less_than_5" => "0",
"date" => "2022-10-15"
}},
{"0",
%{
"Abandon_system" => "0",
"answered_greater_than_20" => "0",
"answered_less_than_10" => "0",
"answered_less_than_15" => "0",
"answered_less_than_20" => "0",
"answered_less_than_5" => "0",
"date" => "2022-10-16"
}},
{"0",
%{
"Abandon_system" => "0",
"answered_greater_than_20" => "1",
"answered_less_than_10" => "17",
"answered_less_than_15" => "6",
"answered_less_than_20" => "1",
"answered_less_than_5" => "11",
"date" => "2022-10-17"
}},
{"0",
%{
"Abandon_system" => "0",
"answered_greater_than_20" => "1",
"answered_less_than_10" => "16",
"answered_less_than_15" => "4",
"answered_less_than_20" => "1",
"answered_less_than_5" => "11",
"date" => "2022-10-18"
}},
{"0",
%{
"Abandon_system" => "0",
"answered_greater_than_20" => "0",
"answered_less_than_10" => "18",
"answered_less_than_15" => "7",
"answered_less_than_20" => "1",
"answered_less_than_5" => "12",
"date" => "2022-10-19"
}},
{"0",
%{
"Abandon_system" => "0",
"answered_greater_than_20" => "1",
"answered_less_than_10" => "21",
"answered_less_than_15" => "6",
"answered_less_than_20" => "1",
"answered_less_than_5" => "9",
"date" => "2022-10-20"
}},
{"1",
%{
"Abandon_system" => "0",
"answered_greater_than_20" => "0",
"answered_less_than_10" => "20",
"answered_less_than_15" => "1",
"answered_less_than_20" => "3",
"answered_less_than_5" => "17",
"date" => "2022-10-21"
}},
{"0",
%{
"Abandon_system" => "0",
"answered_greater_than_20" => "0",
"answered_less_than_10" => "0",
"answered_less_than_15" => "0",
"answered_less_than_20" => "0",
"answered_less_than_5" => "0",
"date" => "2022-10-22"
}},
{"0",
%{
"Abandon_system" => "0",
"answered_greater_than_20" => "0",
"answered_less_than_10" => "0",
"answered_less_than_15" => "0",
"answered_less_than_20" => "0",
"answered_less_than_5" => "0",
"date" => "2022-10-23"
}},
{"0",
%{
"Abandon_system" => "0",
"answered_greater_than_20" => "1",
"answered_less_than_10" => "37",
"answered_less_than_15" => "9",
"answered_less_than_20" => "1",
"answered_less_than_5" => "15",
"date" => "2022-10-24"
}},
{"0",
%{
"Abandon_system" => "0",
"answered_greater_than_20" => "0",
"answered_less_than_10" => "21",
"answered_less_than_15" => "4",
"answered_less_than_20" => "1",
"answered_less_than_5" => "14",
"date" => "2022-10-25"
}},
{"1",
%{
"Abandon_system" => "0",
"answered_greater_than_20" => "1",
"answered_less_than_10" => "21",
"answered_less_than_15" => "0",
"answered_less_than_20" => "2",
"answered_less_than_5" => "12",
"date" => "2022-10-26"
}},
{"0",
%{
"Abandon_system" => "0",
"answered_greater_than_20" => "3",
"answered_less_than_10" => "17",
"answered_less_than_15" => "7",
"answered_less_than_20" => "2",
"answered_less_than_5" => "13",
"date" => "2022-10-27"
}},
{"0",
%{
"Abandon_system" => "0",
"answered_greater_than_20" => "1",
"answered_less_than_10" => "9",
"answered_less_than_15" => "1",
"answered_less_than_20" => "0",
"answered_less_than_5" => "27",
"date" => "2022-10-28"
}},
{"0",
%{
"Abandon_system" => "0",
"answered_greater_than_20" => "0",
"answered_less_than_10" => "0",
"answered_less_than_15" => "0",
"answered_less_than_20" => "0",
"answered_less_than_5" => "0",
"date" => "2022-10-29"
}},
{"0",
%{
"Abandon_system" => "0",
"answered_greater_than_20" => "0",
"answered_less_than_10" => "0",
"answered_less_than_15" => "0",
"answered_less_than_20" => "0",
"answered_less_than_5" => "0",
"date" => "2022-10-30"
}},
{"0",
%{
"Abandon_system" => "0",
"answered_greater_than_20" => "0",
"answered_less_than_10" => "21",
"answered_less_than_15" => "4",
"answered_less_than_20" => "0",
"answered_less_than_5" => "8",
"date" => "2022-10-31"
}}
]
Примечание: проверьте вариант
trim: trueв String.split/3, чтобы избежать пустой последней строки.