2013-06-19 1 views
1

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

' 9574865.0E+10 ' 

Я хотел бы, чтобы прочитать два номера из этого:

957486 5.0E+10 

Проблема может быть воспроизведен, как это:

dat = textscan(' 9574865.0E+10 ','%9f %9f','Delimiter','','CollectOutput',true,'ReturnOnError',false); 

нижеследующая погрешность:

Error using textscan 
Mismatch between file and format string. 
Trouble reading floating point number from file (row 1u, field 2u) ==> E+10 

Удивительно, но если добавить минус, мы не получаем ошибку, но неверный результат:

dat = textscan(' -9574865.0E+10 ','%9f %9f','Delimiter','','CollectOutput',true,'ReturnOnError',false); 

Теперь Дат {1} является:

-9574865   0 

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

ответ

0

Я подозреваю textscanпервые триммеры ведущие пробельные и затем разбирает строку формата. Я думаю, что это, потому что если вы измените yuor формат строки из

'%9f%9f' 

в

'%6f%9f' 

ваш один лайнер внезапно работает. Кроме того, если вы пытаетесь

'%9s%9s' 

вы увидите, что первая строка имеет свои ведущие строки удалены (и, следовательно, имеют 3-х символов «слишком много»), но по какой-то причине, последняя строка сохраняет конечные пробела.

Очевидно, это означает, что вам нужно точно знать, сколько цифр в обоих номерах. Я предполагаю, что это нежелательно.

Обходной может быть что-то вроде следующего:

% Split string on the "dot" 
dat = textscan(<your data>,'%9s%9s',... 
    'Delimiter'  , '.',... 
    'CollectOutput' , true,... 
    'ReturnOnError' , false); 

% Correct the strings; move the last digit of the first string to the 
% front of the second string, and put the dot back 
dat = cellfun(@(x,y) str2double({y(1:end-1), [y(end) '.' x]}), dat{1}(:,2), dat{1}(:,1), 'UniformOutput', false); 

% Cast to regular array 
dat = cat(1, dat{:}) 
+0

Да, он сначала урезает, что именно моя проблема. % 6f не является решением, мне нужно преобразовать все первые 9 символов в число. Существуют и другие строки, в которых используются все 9 символов. – user1719360

+0

@ user1719360: Посмотрите мое последнее редактирование. Можете ли вы попробовать попробовать свои данные? –

+0

Это работает с моей строкой, но каждое 9-значное поле может содержать любую строку, которая будет оцениваться с допустимым числом. Будет ли это работать во всех возможных случаях? – user1719360