Thank you both!
However, the forming a string with string([readline(STDIN) for i in 1:2]) 
leads to a type of 
"Union(ASCIIString,Array{Char,1},UTF8String)[\"1\\n\",\"2\\n\"]" the 
escaped white space formatting then follows through into the eventual 
readdlm object (i.e. fields aren’t properly interpreted).

So the working code I have is much more nasty, temporary objects and all 
kinds of cludge:

function readnlines(f,n)
    local lines=""
    local i=1
    for i=1:n
        lines=lines*readline(f)
    end
    return (lines)
end

readmatrix(f, nlines) = readdlm(IOBuffer(readnlines(f,nlines)))

I think expanding a macro @readnlines(f,nlines) → (readline(f))^nlines) 
might be more elegant, but I don’t know whether a massive 
string*string*...string object is efficient to evaluate.

Certainly in general I think a readnlines function is useful.
So would having line ranges in readdlm - currently it supports a 
‘skipstart’ option (not documented?) - making this a full line-range object 
would be nice.

https://github.com/JuliaLang/julia/blob/454344fcea17021cb6ca5687d0a9f41daedd7e9e/base/datafmt.jl#L252

- readdlm in the Julia source

I also found this discussion from last-year on julia-dev, after trying for 
a while to use the multidimensional / tuple format form of readdlm, I read 
the source & decided that they were probably talking about prospective 
changes, not realised ones! (-:

https://groups.google.com/d/msg/julia-dev/PpSy2NQmkG0/cl67UWJec4QJ

On Tuesday, 12 August 2014 19:33:01 UTC+1, Jameson wrote:

As a slight optimization, you could note that string works by creating an 
> IOBuffer and printing the arguments into it, and then converting the result 
> to a string. Thus, you could skip the extra conversion to a string and back 
> by making the IOBuffer directly. 
>
>
> On Tuesday, August 12, 2014, Iain Dunning <[email protected] 
> <javascript:>> wrote:
>
>> No need for macros!
>> Its an interesting feature request, maybe open a Github issue so people 
>> can discuss it.
>>
>> I think your solution is not terrible, you could generalize it to
>>
>> readcell(f, nlines) = readdlm(IOBuffer(string([readline(f) for i in 
>> 1:nlines])))
>>
>> Then do something like
>>
>> f = open("mydata","r")
>> cells = {}
>> while !eof(f)
>>   push!(cells, readcell(f, 3))
>> end
>> close(f)
>>
>>
>>
>> On Tuesday, August 12, 2014 10:40:24 AM UTC-4, Jarvist Moore Frost wrote:
>>>
>>> I’m writing a Julia parser to read in a large output from a Fortran 
>>> program which is essentially a load of concatenated matrices of differing 
>>> dimensions. It would be really useful to be able to do something along the 
>>> lines of readdlm(file,nlines=3) to pull in i.e. the 3x3 matrix you know 
>>> that follows.
>>>
>>> Currently I’m resorting to things like:
>>>
>>>     celltext=string(readline(f),readline(f),readline(f))
>>>     cell=readdlm(IOBuffer(celltext))
>>>
>>> And this really doesn’t feel like a very elegant method (not helped as 
>>> neither readline nor readlines appear to accept ‘number of lines’ as an 
>>> argument).
>>>
>>> Am I missing the Julia way to do things here? Or should I start writing 
>>> @macros to expand to this level of nitty gritty?
>>> ​
>>>
>>  ​

Reply via email to