2015-07-02 4 views
0

Я пытаюсь импортировать txt-файл с разделителями шириной, используя функцию textscan. Файл имеет ширину 80 символов, без разделителя, а требуемые 12 столбцов имеют разную ширину символов. Я попытался сделать это, указав ширину строки (т. Е. 12 строк, каждая из которых отличается шириной символов, которые составляют до 80), но как только пространство (поскольку некоторые значения отсутствуют), MATLAB интерпретирует это как мой разделитель и испортил формат.MATLAB: textscan с использованием файла с разделителем ширины с разделителем

data= textscan(fileID, '%5s %7s %1s %1s %1s %17s %12s %12s %10s %5s %6s %3s'); 

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

ответ

1

Вам необходимо изменить значение разделителю и пробельных символов опорожнить:

format_string = '%5s %7s %1s %1s %1s %17s %12s %12s %10s %5s %6s %3s'; 
C = textscan(fid, format_string, 'delimiter', '', 'whitespace', ''); 

Таким образом MATLAB будет рассматривать каждый символ, включая пробелы, а допустимые символы.

+0

это именно то, что я искал. Великий! благодаря! – CeeGee

0

Хммм, у меня возникла такая же проблема с textscan. Ну, вот это долгий путь вокруг него (это отнюдь не самое лучшее решение, но оно должно работать)

fid=fopen('txtfile.txt','rt'); %//load in file 
a=fscanf(fid'%c');  %//scan the thing into chars 
fclose(fid); 

for r = 0:NumberOfRowsInUrData -1 %//Now the loop... Number of rows in your data can also be calculated by size(a,2)/20 
b(r+1,:) = a(1+20*r:20*(r+1)); %// this will correctly index everything 
end 

Хорошая вещь в том, что теперь все в матрице Ь, вы можете просто индексировать символы как string1 = b (:, 1: 5), и он выведет все в красивой матрице.

Недостатком c является цикл for, который, я думаю, вы сможете заменить чем-то вроде cellfun или чем-то еще.

+0

Я совершенно новичок в Matlab, поэтому мне может не хватать что-то очевидное здесь, но оно, похоже, не работает. b возвращает символ 2x20, состоящий только из первых 40 символов из первой строки данных. помогите объяснить, как цикл должен работать? (значение 20 и т. д.) заблаговременно! – CeeGee

+0

Ну, цикл в основном индексирует длинную последовательность символов Char в логическом формате. Я использовал fid как верхний предел, который, вероятно, был ошибкой (я использовал его для простого теста), в основном, верхний предел - это количество строк в ваших данных. Для каждой строки ваших данных укажите 20 символов, соответствующих этой строке. – GameOfThrows

+0

Я изменил 20 на 80, так как я предполагаю, что вы имели в виду. как только я это сделаю, возникает странный результат. b - правильные размеры (32x80 символов), но только первая строка выглядит так, как это было сделано. http://www.tiikoni.com/tis/view/?id=45abcce это то, что я имею в виду – CeeGee

Смежные вопросы