将多行字符串解析为数组

时间:2014-05-30 16:17:25

标签: julia

我试图了解Julia,来自Python。目前正在解决一些Project Euler问题,我已经在Julia中使用Python解决了这个问题,以便更好地理解语言。我做的很多事情(在Project Euler和现实生活中)是将一个大的多线数据对象解析成一个数组。例如,如果我有数据

data = """1 2 3 4
5 6 7 8
9 0 1 2"""

在python中我可能会这样做

def parse(input):
    output = []
    for line in input.splitlines():
         output.append(map(int,line.split()))
    return np.array(output)

这是我到目前为止在朱莉娅所拥有的:

function parse(input)
    nrow = ncol = 0
    # Count first
    for row=split(input,'\n')
        nrow += 1
        ncol = max(ncol,length(split(row)))
    end

    output = zeros(Int64,(nrow,ncol))
    for (i,row) in enumerate(split(input,'\n'))
        for (j,word) in enumerate(split(row))
            output[i,j] = int(word)
        end
    end
    return output
end

" pythonic"的Julia版本是什么?叫什么名字?无论是什么,我都不认为我这样做。我非常确定有一种方法可以(1)不必两次传递数据,(2)不必如此具体地分配数组。我试了一下hcat / vcat,没有运气。

我欢迎解决此问题的建议。我也有兴趣参考适当的Julia风格(julia-onic?)和一般语言使用实践。谢谢!

1 个答案:

答案 0 :(得分:5)

readdlm在这里非常有用。请参阅所有选项的文档,但这是一个示例。

julia> data="1 2 3 4
       5 6 7 8
       9 0 1 2"
"1 2 3 4\n5 6 7 8\n9 0 1 2"

julia> readdlm(IOBuffer(data))
3x4 Array{Float64,2}:
 1.0  2.0  3.0  4.0
 5.0  6.0  7.0  8.0
 9.0  0.0  1.0  2.0

julia> readdlm(IOBuffer(data),Int)
3x4 Array{Int32,2}:
 1  2  3  4
 5  6  7  8
 9  0  1  2