GNU Octave: чтение данных со значениями NA с использованием textscan()

Мне нужно прочитать данные из файла ASCII, где отсутствующие значения указаны как NA. Использование textscan(...) не работает, потому что textscan(...) останавливает чтение/анализ при первом появлении NA.

Вот простая демонстрация проблемы:

x = textscan ( "1 ; 2 ; 3\n4 ; NA ; 6" , '%d %d %d' , 'Delimiter' , ';' , 'ReturnOnError' , false )
error: textscan: Read error in field 2 of row 2

Я также пытался указать textscan(...) интерпретировать NA как "пустое значение", но безуспешно:

x = textscan ( "1 ; 2 ; 3\n4 ; NA ; 6" , '%d %d %d' , 'Delimiter' , ';' , 'TreatAsEmpty' , 'NA' , 'ReturnOnError' , false )
error: textscan: Read error in field 2 of row 2

Может кто-нибудь объяснить, что происходит, или как заставить это работать?

Обратите внимание, что это всего лишь упрощенный пример, иллюстрирующий проблему. Формат данных в моих файлах немного сложнее, и я действительно полагаюсь на textscan(...) для его разбора; Я не думаю, что смогу легко сделать это без текстового сканирования (...).

(Я использую Octave 4.2.1.)


person mbrennwa    schedule 09.02.2018    source источник


Ответы (1)


NA определен для чисел с плавающей запятой, поэтому вы должны использовать спецификатор преобразования '%f' вместо '%d'.

x = textscan ( "1 ; 2 ; 3\n4 ; NA ; 6" , '%f %f %f' ,
    'Delimiter' , ';' , 'ReturnOnError' , false )
person rahnema1    schedule 09.02.2018
comment
Однако это не согласуется с MATLAB. :/ Протестировано как в MATLAB, так и в Octave. Работает в Октаве. - person Sardar Usama; 09.02.2018
comment
@SardarUsama Спасибо, я думаю, что вместо NA следует использовать NaN, вы можете проверить это? - person rahnema1; 09.02.2018
comment
@SardarUsama Если используется %d, NA преобразуется в 0 вместо NaN. - person rahnema1; 09.02.2018
comment
В MATLAB проблема вызвана \n. См. здесь: #1 и #2 - person Sardar Usama; 09.02.2018
comment
????????. В любом случае, ваш ответ в порядке и правилен, поскольку это потому что вопрос задается про октаву - person Sardar Usama; 09.02.2018