Небольшое замечание о чтении и записи переменных 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.