Since `string` prints it's arguments, it was missing a ... to work as intended: string([readline(f) for i in 1:nlines]...)
Since you wanted an IOBuffer anyways, I would use the following approach, which avoids lots of garbage creation over repeatedly calling `string` (aka `*`): function readnlines(f,n) lines = IOBuffer() for i = 1:n write(lines, readline(f)) end return lines # or takebuf_string(lines) if you didn't want an IOBuffer end On Wed, Aug 13, 2014 at 7:08 AM, Jarvist Moore Frost <[email protected]> wrote: > 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]> 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? >>>> >>>> >>> >
