Fixed length records: Difference between revisions

(Added Perl example)
Line 607:
............................................................8 enil detnednI
NIGRAM TR 9 eniL</pre>
 
=={{header|Phix}}==
You might want to investigate using builtins such as get_text() and read_lines(), but they were
never really designed for fixed length record handling and for me, for this task, their limits
outweight any advantages. To simplify matters, this creates any files needed on the fly.
<lang Phix>constant sample_text = """
Line 1...1.........2.........3.........4.........5.........6.........7.........8
Line 2
Line 3
Line 4
 
Line 6
Line 7
Indented line 8............................................................
Line 9 RT MARGIN"""
 
constant indat = "infile.dat",
outdat = "outfile.dat"
 
if not file_exists(indat) then
object text = get_text("sample.txt")
if text=-1 then text = sample_text end if
sequence s = split(text,'\n')
integer fn = open(indat,"wb")
for i=1 to length(s) do
puts(fn,s[i]&repeat(' ',80-length(s[i])))
end for
close(fn)
printf(1,"%s created (%d bytes)\n",{indat,get_file_size(indat)})
end if
 
function get_block(integer fn, size)
string res = ""
for i=1 to size do
res &= getc(fn)
end for
return res
end function
 
integer fn = open(indat,"rb"),
isize = get_file_size(indat)
puts(1,"reversed:\n")
for i=1 to isize by 80 do
?reverse(get_block(fn,80))
end for
close(fn)
 
-- Bonus part, 16*64 (=1024) block handling:
 
procedure put_block(integer fn, sequence lines)
lines &= repeat("",16-length(lines))
for i=1 to length(lines) do
string li = lines[i]
if length(li)>64 then
li = li[1..64]
else
li &= repeat(' ',64-length(li))
end if
puts(fn,li)
end for
end procedure
 
fn = open(outdat,"wb")
put_block(fn,split(sample_text,'\n'))
close(fn)
integer osize = get_file_size(outdat)
printf(1,"\n%s created (%d bytes):\n",{outdat,osize})
fn = open(outdat,"rb")
sequence lines = {}
for i=1 to osize by 64 do
string line = get_block(fn,64)
?line
lines = append(lines,trim_tail(line,' '))
end for
lines = trim_tail(lines,{""})
puts(1,"\ntrimmed:\n")
pp(lines,{pp_Nest,1})
{} = delete_file(indat) -- (for consistent 2nd run)</lang>
{{out}}
<pre>
infile.dat created (720 bytes)
reversed:
"8.........7.........6.........5.........4.........3.........2.........1...1 eniL"
" 2 eniL"
" 3 eniL"
" 4 eniL"
" "
" 6 eniL"
" 7 eniL"
"............................................................8 enil detnednI "
"NIGRAM TR 9 eniL"
 
outfile.dat created (1024 bytes):
"Line 1...1.........2.........3.........4.........5.........6...."
"Line 2 "
"Line 3 "
"Line 4 "
" "
"Line 6 "
"Line 7 "
" Indented line 8............................................"
"Line 9 "
" "
" "
" "
" "
" "
" "
" "
 
trimmed:
{"Line 1...1.........2.........3.........4.........5.........6....",
"Line 2",
"Line 3",
"Line 4",
{},
"Line 6",
"Line 7",
" Indented line 8............................................",
"Line 9"}
</pre>
 
=={{header|REXX}}==
7,820

edits