2015-12-19 56 views
1

這是我想讀入朱莉婭在我的文件中的行:朱莉婭解析浮動從文件:類型愁楚

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])開頭。

這不應該更容易嗎?

回答

2

split函數返回的ASCIIString陣列所以,frac_coords將成爲類型的變量:

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

和任何嘗試來改變它的元件的類型將導致一個異常:

frac_coords[1]=0 # => Error

那麼,爲什麼不簡單地使用正確類型的不同變量?

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

EDIT或使用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 
+0

感謝。我仍然不認爲這是直觀的。 'x = 1.0'然後'x = 1'從Float64轉換爲Int。我想這會涉及到數組中的混合類型。儘管如此,它可能會變成一個數組{T},其中T是兩種類型的聯合吧? – Cokes

+0

@Cokes,肯定是的,存在許多可能的解決方案,例如。正如你已經提到過的,可以使用一個更普通的容器,比如'Union'的矢量或者'Any'類型的矢量。 –