Jump to content

Stream merge: Difference between revisions

Added Elixir
(Added Elixir)
Line 120:
<pre>
</pre>
 
=={{header|AWK}}==
<lang AWK>
Line 188 ⟶ 189:
}
</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}}==
Anonymous user
Cookies help us deliver our services. By using our services, you agree to our use of cookies.