Небольшое замечание о чтении и записи переменных NC_CHAR
и NC_STRING
Есть два распространенных типа для хранения строковых данных в переменных NetCDF. Первый из них — это NC_CHAR
. В этом случае одномерный массив строк хранится в двухмерном массиве char**
. Пользователь должен определить максимальную длину строки и добавить соответствующее измерение NetCDF. Начиная с версии NetCDF4 существует тип данных NC_STRING
, который позволяет напрямую определять строковые переменные, чтобы напрямую сопоставлять N-мерный массив строк с N-мерным массивом в структуре файла NetCDF.
Переменные NC_STRING
В данном пакете тип Julia String
соответствует типу данных NC_STRING
. Это означает, что вызов
nccreate(filename, varname, dims..., t=String)
или
NcVar(varname,dims,t=String)
приведет к созданию переменной NetCDF типа NC_STRING
. В эти переменные можно напрямую записывать массив Array{String}
соответствующей формы. Аналогичным образом при вызове ncread
или NetCDF.readvar
для любой из этих переменных будет возвращен массив Array{String}
Переменные NC_CHAR
С переменными NC_CHAR
работать немного сложнее по двум причинам. Во-первых, измерения переменных NetCDF не соответствуют измерениям итогового строкового массива из-за дополнительной оси str_len
(или аналогичной), которая вводится в файле NetCDF. Поэтому n-мерный массив строк соответствует (n+1)-мерному массиву NC_CHAR
.
Во-вторых, тип NC_CHAR
традиционно используется также для хранения сжатых данных. Поэтому такие символьные массивы не всегда желательно автоматически преобразовывать в строки. Так или иначе, с этими типами переменных можно работать так:
Допустим, имеется переменная NetCDF типа NC_CHAR
с измерениями (str_len: 10, axis2: 20). Вызов x=ncread(...)
или x=readvar(...)
для этой переменной вернет массив Array{ASCIIChar,2}
размером (10,20)
в той форме, как он представлен на диске. Тип ASCIIChar
— это небольшая оболочка вокруг UInt8
, необходимая для диспетчеризации. Его можно преобразовывать в Char
или UInt8
просто с помощью функции convert
. Возвращенный массив можно либо использовать напрямую (если он числовой, можно использовать reinterpret(UInt8,x)
), либо преобразовать в Vector{String}
с помощью вызова
y=nc_char2string(x)
который возвращает строковый вектор длиной 20.
В этом случае возможен такой пример создания и записи переменных NC_CHAR
:
nccreate(filename,varname,"str_len",20,"DimValues",5,t=NC_CHAR) xs = ["a","bb","ccc","dddd","eeeee"] ncwrite(filename,varname,nc_string2char(xs))
Вызов string2char
преобразовывает Vector{String}
в матрицу Matrix{UInt8}
, которую можно записать в файл NetCDF.