Почему текстовая функция matlab не может читать + 22.24 как число с плавающей точкой? - PullRequest
0 голосов
/ 13 сентября 2018

В настоящее время у меня проблема с функцией сканирования текста Matlab. Я получил файл данных, который выглядит следующим образом:

     1,2018/08/14 17:06:15,  0,+ 22.24,+ 22.46,+ 18.18,+0.0000,+0.0005,LLLLLLLLLL,LLLLLLLLLL,LLLL

или иногда, когда датчик не работает должным образом, это выглядит так:

   1,2018/07/11 17:02:53,  0,+ 23.88,+ 24.78,+ 23.65,+++++++,+ 23.94,+ 23.01,+ 24.33,LLLLLLLLLL,LLLLLLLLLL,LLLL

Поскольку данные варьируются от файла к файлу, я создаю соответствующий формат формата из заголовка. В 1-м случае это выглядело бы как

formatSpec = '%*u %s %*u%f%f%f%f%f%*[^\n]'

и во 2-м случае, как

formatSpec = '%*u %s %*u%f%f%f%f%f%f%f%*[^\n]'

Я использую функцию texscan следующим образом:

textscan(fileID, formatSpec_data, data_rows, 'Delimiter', ',', 'TreatAsEmpty', {'+++++++'},'EmptyValue', NaN, 'ReturnOnError', 0 );

но он продолжает выдавать ошибку с сообщением

Error using textscan
Mismatch between file and format character vector.
Trouble reading 'Numeric' field from file (row number 1, field number 4) ==> + 23.88,+ 24.78,+ 23.65,+++++++,+ 23.94,+ 23.01,+ 24.33,LLLLLLLLLL,LLLLLLLLLL,LLLL\n

Error in data_logger (line 31)
dataArray = textscan(fileID, formatSpec_data, data_rows, 'Delimiter', delimiter, 'HeaderLines' ,startRow, 'TreatAsEmpty', {'+++++++'},'EmptyValue', NaN, 'ReturnOnError', 0 );

Когда я деактивирую returnOnError, тогда тексты могут читать только первую строку и, кроме строки даты / времени, все просто пусто. Я также пытался использовать текстовое сканирование без TreatAsEmpty и / или EmptyValue, но я получаю тот же результат. Я действительно не понимаю, почему тексты могут иметь проблемы с чтением, например. , + 22,24 как поплавок. Когда я указываю formatSpec для чтения всех данных в виде строк, это работает, но потом мне приходится использовать str2num, чего я на самом деле не хочу делать.

Я благодарен за любую помощь и с нетерпением жду, чтобы понять это поведение.

1 Ответ

0 голосов
/ 16 сентября 2018

Краткий ответ: Matlab не нравится пробел между + и числом в этих полях.Я думаю, что самое простое решение может быть просто сказать Matlab игнорировать +, называя его пробелом.Добавьте аргументы 'WhiteSpace','+' при вызове textcan, например, так:

textscan(fileID, formatSpec_data, data_rows, 'Delimiter', ',', 'EmptyValue', NaN, 'ReturnOnError', 0 , 'WhiteSpace', '+');

Обратите внимание, что я также удалил аргумент «TreatAsEmpty», потому что, если вы рассмотрите все + как пробел, он все равно будет пустым.

Другим вариантом будет предварительный анализ файла и удаление пробела между знаком + и числом.Вы можете прочитать файл с помощью fileread, выполнить замену с помощью strrep или regexprep, а затем запустить текстовое сканирование для результата.

datain = fileread('mydatafile.csv')
datain = strrep(datain,'+ ','+');
textscan(datain, formatSpec_data, data_rows, 'Delimiter', ',', 'TreatAsEmpty', {'+++++++'},'EmptyValue', NaN, 'ReturnOnError', 0 );

Наконец, если вы застряли там, где вам абсолютно необходимо прочитать текст, а затем преобразовать в числовойзначения, попробуйте str2doubleq , доступный на Matlab File Exchange.Это намного быстрее, чем str2double или str2num.

...