【问题标题】:Julia parsing float from file: type woesJulia 从文件中解析浮点数:类型问题
【发布时间】:2015-12-19 21:33:03
【问题描述】:

这是我要读入 Julia 的文件中的行:

O1 O 0.00351(19) 0.66716(19) -0.36485(16)

我想替换括号并将它们读为浮点数。我认为这应该有效,但它没有。

lines = readlines(open("myfile"))
line = lines[1]

frac_coords = split(line)[3:end]
i = 1
frac_coords[i] = replace(frac_coords[i], "(", "")

frac_coords[i] = replace(frac_coords[i], ")", "")

frac_coords[i] = parse(Float64, frac_coords[i])

我得到错误:

LoadError: MethodError: `convert` has no method matching convert(::Type{SubString{ASCIIString}}, ::Float64)
This may have arisen from a call to the constructor SubString{ASCIIString}(...),
since type constructors fall back to convert methods.
Closest candidates are:
  call{T}(::Type{T}, ::Any)
  convert{T<:AbstractString}(::Type{SubString{T<:AbstractString}}, !Matched::T<:AbstractString)
  convert{T<:AbstractString,S<:Union{Char,Int32,UInt32}}(::Type{T<:AbstractString}, !Matched::AbstractArray{S<:Union{Char,Int32,UInt32},1})
  ...

 while loading In[53], in expression starting on line 14

 in setindex! at array.jl:313

我尝试过转换为 AbstractStrings。一开始是convert(Array{ASCIIString}, split(line)[3:end])

这不是更容易吗?

【问题讨论】:

    标签: julia


    【解决方案1】:

    split 函数返回一个 ASCIIString 数组,因此,frac_coords 将成为该类型的变量:

    frac_coords = split(line)[3:end]
    typeof(frac_coords) # =>  Array{SubString{ASCIIString},1}
    

    任何改变它的元素类型的尝试都会导致异常:

    frac_coords[1]=0 # =&gt; Error

    那么,为什么不简单地使用正确类型的不同变量呢?

    floats=Array(Float64,length(frac_coords))
    floats[i] = parse(Float64, frac_coords[i])
    

    编辑或使用Vector{Any}()作为两种类型的容器:

    frac_coords=Vector{Any}()
    push!(frac_coords,split(line)[3:end]...)
    for i=1:length(frac_coords)
       frac_coords[i]=replace(replace(frac_coords[i], "(", ""),")", "")
       frac_coords[i]=parse(Float64,frac_coords[i])
    end
    

    【讨论】:

    • 谢谢。我仍然认为它不是那么直观。 x=1.0 然后 x=1 从 Float64 转换为 Int。我想这将涉及数组中的混合类型。不过,它可以更改为 Array{T},其中 T 是两种类型的并集,对吧?
    • @Cokes,绝对是的,存在许多可能的解决方案,例如正如您已经提到的,可以使用更通用的容器,例如Unions 的向量或Any 的向量,类型。
    猜你喜欢
    • 2022-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-24
    • 2011-06-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多