Oleg Kobchenko wrote:
> We need a general purpose read line functionality.
> It is common in C runtime and in other languages.
> Although, it is possible to do in J, but it's better not
> to do the low-level stuff every time.
I suggest that we add two new definitions to the files script. One is
Joey's verb to read a LF-terminated block from a file, the other is
Oleg's adverb to apply a function to each line of a file.
In each case, the file is assumed to be in lines terminated by LF, and a
trailing LF is assumed if not present. CR is removed. Blocksize is
hardcoded at 1e6.
Definitions are:
NB.*freadblock v read block from file
NB. y is filename;start position
NB. returns: block;new start position
freadblock=: 3 : 0
'f p'=. y
f=. 8 u: f NB. for j601
s=. 1!:4 <f
if. s = _1 do. return. end.
if. p < s do.
dat=. 1!:11 f;p,1e6<.s-p
len=. 1 + dat i: LF
p=. p + len
if. len > #dat do.
if. p > s do.
dat=. dat, LF
else.
'file not in LF-delimited lines' 13!:8[3
end.
else.
dat=. len {. dat
end.
else.
dat=. ''
end.
(dat -. CR);p
)
NB.*fapplylines a apply verb to lines in file delimited by LF
fapplylines=: 1 : 0
y=. 8 u: y NB. for j601
s=. 1!:4 <y
if. s = _1 do. return. end.
p=. 0
while. p < s do.
dat=. 1!:11 y;p,1e6<.s-p
len=. 1 + dat i: LF
p=. p + len
if. len > #dat do.
if. p > s do.
dat=. dat, LF
else.
'file not in LF-delimited lines' 13!:8[3
end.
else.
dat=. len {. dat
end.
u ;._2 dat -. CR
p=. s
end.
)
With these definitions, Yoel's problem would have solutions like the
following:
getcsn=: 3 : 0
ptr=. 0
res=. i. 0 0
while.
'dat ptr'=. freadblock y;ptr
# dat=. <;._2 dat do.
res=. ~. res, 4 }."1 > dat #~ (<'csn ') = 4 {. each dat
end.
)
readcsn=: 3 : 0
CSN=: i.0 0
readcsn1 fapplylines y
CSN
)
readcsn1=: 3 : 0
if. 'csn ' -: 4 {. y do. CSN=: ~. CSN, 4 }. y end. 0
)
----------------------------------------------------------------------
For information about J forums see http://www.jsoftware.com/forums.htm