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?
>
>