Stream merge: Difference between revisions
Content added Content deleted
Catskill549 (talk | contribs) |
(Added Elixir) |
||
Line 120: | Line 120: | ||
<pre> |
<pre> |
||
</pre> |
</pre> |
||
=={{header|AWK}}== |
=={{header|AWK}}== |
||
<lang AWK> |
<lang AWK> |
||
Line 188: | Line 189: | ||
} |
} |
||
</lang> |
</lang> |
||
=={{header|Elixir}}== |
|||
<lang elixir>defmodule StreamMerge do |
|||
def merge2(file1, file2), do: mergeN([file1, file2]) |
|||
def mergeN(files) do |
|||
Enum.map(files, fn fname -> File.open!(fname) end) |
|||
|> Enum.map(fn fd -> {fd, IO.read(fd, :line)} end) |
|||
|> merge_loop |
|||
end |
|||
defp merge_loop([]), do: :ok |
|||
defp merge_loop(fdata) do |
|||
{fd, min} = Enum.min_by(fdata, fn {_,head} -> head end) |
|||
IO.write min |
|||
case IO.read(fd, :line) do |
|||
:eof -> File.close(fd) |
|||
List.delete(fdata, {fd, min}) |> merge_loop |
|||
head -> List.keyreplace(fdata, fd, 0, {fd, head}) |> merge_loop |
|||
end |
|||
end |
|||
end |
|||
filenames = ~w[temp1.dat temp2.dat temp3.dat] |
|||
Enum.each(filenames, fn fname -> |
|||
IO.puts "#{fname}: " <> File.read!(fname) |> String.replace("\n", " ") |
|||
end) |
|||
IO.puts "\n2-stream merge:" |
|||
StreamMerge.merge2("temp1.dat", "temp2.dat") |
|||
IO.puts "\nN-stream merge:" |
|||
StreamMerge.mergeN(filenames)</lang> |
|||
{{out}} |
|||
<pre style="height: 64ex; overflow: scroll"> |
|||
temp1.dat: 1 3 9 14 15 17 28 |
|||
temp2.dat: 7 8 14 14 23 26 28 29 30 |
|||
temp3.dat: 9 23 25 29 |
|||
2-stream merge: |
|||
1 |
|||
3 |
|||
7 |
|||
8 |
|||
9 |
|||
14 |
|||
14 |
|||
14 |
|||
15 |
|||
17 |
|||
23 |
|||
26 |
|||
28 |
|||
28 |
|||
29 |
|||
30 |
|||
N-stream merge: |
|||
1 |
|||
3 |
|||
7 |
|||
8 |
|||
9 |
|||
9 |
|||
14 |
|||
14 |
|||
14 |
|||
15 |
|||
17 |
|||
23 |
|||
23 |
|||
25 |
|||
26 |
|||
28 |
|||
28 |
|||
29 |
|||
29 |
|||
30 |
|||
</pre> |
|||
=={{header|Fortran}}== |
=={{header|Fortran}}== |