The essential part first:

julia> a,b,c,d=map(parse,split("9 2 2 1.3\n"))
4-element Array{Real,1}:
 9
 2
 2
 1.3

but see what you actually get back...
julia> typeof(a)
Int64
julia> typeof(d)
Float64

That's Julia's type inferencing at play. And functional abilities (map,
parse). See the manual on those.

Now as originally needed...

julia> io=IOBuffer("9 2 2  1.3\n")
IOBuffer(data=UInt8[...], readable=true, writable=false, seekable=true,
append=false, size=10, maxsize=Inf, ptr=1, mark=-1)

julia> n,nup,ndn,a=map(parse,split(readline(io)))
4-element Array{Real,1}:
 9
 2
 2
1.3

julia> typeof(n)
Int64

julia> typeof(a)
Float64

It's probably better to do it properly in a function rather than like that
as a one-liner - so you can catch exceptions, etc.

-- Adrian.


On Thu, Dec 24, 2015 at 8:36 PM, Steven White <[email protected]> wrote:

> Say I  have a data file in plain text, which starts with some lines that
> describe matrix sizes, etc, for the data that follows.  For example, the
> first line might be
> 9 2 2 1.3
>
> To read this file, in C I would use something like this call to scanf:
> scanf("%d%d%d%lf",&n,&nup,&ndn,&a);
>
> How do I do this in julia?  There doesn't seem to be a simple, obvious
> way.  Of course, you can read the line as a string, and parse it using
> regular expressions, but this is much messier than the call to scanf.
>
> Here is a solution:
> getline() = readdlm(IOBuffer(readline()),Any)
>
> n,nup,ndn,a = getline()
>
> This seems to work reliably.  (For example, it doesn't choke if there
> happen to be two spaces between some of the numbers.)
>
> It is also obscure and doesn't give any warnings if some of the types
> aren't what was expected. It also seems inefficient if you try to read a
> lot of data this way.
>
> Questions:  Why isn't something like this (but better) built in to julia?
> Is there some nice method that I've missed that does this better?  Can this
> getline() function be improved?
>
>

Reply via email to