MATLAB: сканирование текста с использованием текстового файла с разделителями по ширине

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

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

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


person CeeGee    schedule 02.07.2015    source источник


Ответы (2)


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

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

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

person craigim    schedule 02.07.2015
comment
это именно то, что я искал. отличный! Спасибо! - person CeeGee; 03.07.2015

Хм, у меня была такая же проблема с 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

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

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

person GameOfThrows    schedule 02.07.2015
comment
Я новичок в Matlab, поэтому я могу упустить что-то очевидное, но, похоже, это не работает. b возвращает char 2x20, состоящий только из первых 40 символов из первой строки данных. не хотите объяснить, как цикл должен работать? (значение 20 и т.д.) заранее спасибо! - person CeeGee; 02.07.2015
comment
Что ж, цикл в основном индексирует длинную последовательность символов в логическом формате. Я использовал fid как верхний предел, который, вероятно, был ошибкой (я использовал его для простого теста), в основном, верхний предел должен быть количеством строк в ваших данных. Для каждой строки ваших данных проиндексируйте 20 символов, соответствующих этой строке. - person GameOfThrows; 02.07.2015
comment
я поменял 20 на 80, как я полагаю, это то, что вы имели в виду. как только я это делаю, возникает странный результат. b - правильные размеры (32x80 символов), но только первая строка выглядит так, как задумано. tiikoni.com/tis/view/?id=45abcce вот что я имею в виду - person CeeGee; 02.07.2015
comment
хм, так что, кажется, отступ на 1? странно, у меня это работает нормально, вы пробовали его индексировать? то есть b(:,75:80), чтобы посмотреть, как это выглядит? - person GameOfThrows; 02.07.2015
comment
Я думаю, что это может быть Matlab, представляющий/отображающий значение забавным образом, я, кажется, не сталкиваюсь с той же проблемой в своем тесте. Если вы измените NumberOfRowsInUrData на 32 и измените a(1+80*r:80*(r+1)), это должно дать правильный ответ 32*80. - person GameOfThrows; 02.07.2015