diff --git a/data/string_labeled_value_eg.sav b/data/string_labeled_value_eg.sav new file mode 100644 index 0000000..a5bb89e Binary files /dev/null and b/data/string_labeled_value_eg.sav differ diff --git a/src/parser.jl b/src/parser.jl index 6f2ba83..757f049 100644 --- a/src/parser.jl +++ b/src/parser.jl @@ -207,10 +207,13 @@ end function _handle_value_label!(val_labels, value, label, vallabels) lblname = Symbol(_string(val_labels)) type = value_type(value) - # String variables do not have value labels # All integers are Int32 and all floats are Float64 (ReadStat handles type conversion) # Tentatively save tagged missing values as Char - if Int(type) <= 3 + if type == READSTAT_TYPE_STRING + lbls = get!(Dict{Union{String,Char},String}, vallabels, lblname) + val = value_is_tagged_missing(value) ? value_tag(value) : _string(string_value(value)) + lbls[val] = _string(label) + elseif Int(type) <= 3 lbls = get!(Dict{Union{Int32,Char},String}, vallabels, lblname) val = value_is_tagged_missing(value) ? value_tag(value) : int32_value(value) lbls[val] = _string(label) diff --git a/src/writestat.jl b/src/writestat.jl index fdb1f8e..378dfa9 100644 --- a/src/writestat.jl +++ b/src/writestat.jl @@ -32,7 +32,8 @@ function _readstat_string_width(col) elseif nonmissingtype(eltype(col)) == Char return Csize_t(1) else - maxlen = maximum(col) do str + string_col = eltype(col) <: LabeledValue ? refarray(col) : col + maxlen = maximum(string_col) do str ismissing(str) ? 0 : ncodeunits(str) end return Csize_t(maxlen) diff --git a/test/readstat.jl b/test/readstat.jl index 2c3522c..1c35980 100644 --- a/test/readstat.jl +++ b/test/readstat.jl @@ -306,6 +306,14 @@ end @test m.notes == ["some test text as notes", " (Entered 15-Aug-2018)", "some other comments", " (Entered 15-Aug-2018)"] @test m.file_ext == ".sav" + + # Test for string values, #52 + sav2 = "$(@__DIR__)/../data/string_labeled_value_eg.sav" + d2 = readstat(sav2) + @test eltype(d2[1]) == LabeledValue{String, Union{Char, String}} + @test refarray(d2[1]) == ["BE33", "BE35"] + @test valuelabels(d2[1]) == ["Prov. Liege", "Prov. Namur"] + end @testset "readstat por" begin