External sort: Difference between revisions

(Added Perl example)
Line 336:
876
987</pre>
 
=={{header|Phix}}==
Slight variation on [[Stream_Merge#Phix|Stream_Merge]]
<lang Phix>include builtins/pqueue.e
include builtins/pfile.e -- write_lines() - not [yet] documented
procedure add(integer fn, pq)
object line = gets(fn)
if line=-1 then
close(fn)
else
pq_add({fn,line}, pq)
end if
end procedure
procedure sort_files(sequence filenames)
for i=1 to length(filenames) do
sequence lines = get_text(filenames[i],GT_LF_STRIPPED),
sorted = sort(lines)
printf(1,"%s:%v => %v\n",{filenames[i],lines,sorted})
if write_lines(filenames[i],sorted)!=1 then ?9/0 end if
end for
end procedure
 
procedure merge_files(integer outfn, sequence filenames)
integer pq = pq_new()
for i=1 to length(filenames) do
add(open(filenames[i], "r"),pq)
end for
while not pq_empty(pq) do
{integer fn, string line} = pq_pop(pq)
puts(outfn,line)
add(fn, pq)
end while
pq_destroy(pq)
end procedure
 
procedure test()
integer nf = rand(5), -- number of files
lp = 3 -- lines per file
sequence filenames = {},
lines = shuffle(tagset(nf*lp))
for i=1 to nf do
string filename = sprintf("file%d.txt",i)
filenames = append(filenames,filename)
integer fn = open(filename,"w")
for l=1 to lp do
printf(fn,"Line %02d\n",lines[l])
end for
lines = lines[lp+1..$]
close(fn)
end for
printf(1,"sorting %d lines split over %d files\n",{nf*lp,nf})
sort_files(filenames)
integer outfn = 1 -- or open("results.txt","w")
merge_files(outfn,filenames)
-- close(outfn)
for i=1 to nf do
{} = delete_file(filenames[i])
end for
end procedure
test()</lang>
{{out}}
<pre>
sorting 9 lines split over 3 files
file1.txt:{"Line 04","Line 01","Line 09"} => {"Line 01","Line 04","Line 09"}
file2.txt:{"Line 06","Line 07","Line 02"} => {"Line 02","Line 06","Line 07"}
file3.txt:{"Line 08","Line 03","Line 05"} => {"Line 03","Line 05","Line 08"}
Line 01
Line 02
Line 03
Line 04
Line 05
Line 06
Line 07
Line 08
Line 09
</pre>
 
=={{header|Python}}==
7,820

edits