Документация Engee

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