Matlab: как я могу читать строку, разделенную пробелами, но игнорировать одиночные пробелы (используя textscan)?

Привет всем и заранее спасибо. Это мой первый пост здесь, пожалуйста, дайте мне знать, если я должен сделать это по-другому.

У меня есть большой текстовый файл, содержащий следующие строки:

"DATE      TIMESTAMP    T W M     T AL M C  A_B_C"

Сначала я прочитал это при использовании команд fopen и fget1, чтобы получить строку:

Readout = DATE      TIMESTAMP    T W M     T AL M C A_B_C

Я хочу преобразовать это, например. текстскан. Хотя я чувствую, что знаю Matlab, я ни в коем случае не являюсь экспертом в этой команде, и у меня возникают проблемы с ее использованием.

Я хочу получить:

A = 'Date' 'TIMESTAMP' 'T W M' 'T AL M C' 'A_B_C'

Однако, используя следующий код:

 A = textscan(Readout,'%s');
 A = A{1}';

Я получил:

A = 'DATE'    'TIMESTAMP'    'T'    'W'    'M'    'T'    'AL'    'M'    'C'    'A_B_C'

Как я спросил в заголовке, есть ли способ игнорировать одиночные пробелы?

PS: В конце написания этого я только что придумал не очень элегантное решение, но все же хотел бы знать, есть ли какое-нибудь более приятное решение:

ReadBetter = [];
for n = 1:length(Read)-1
if Read(n) == ' ' & Read(n+1) ~= ' '
else
    ReadBetter = [ReadBetter Read(n)];
end
end
ReadBetter = [ReadBetter Read(n+1)];
Read   
ReadBetter

Output:
Read =

DATE      TIMESTAMP    T W M     T AL M C   A_B_C

ReadBetter =

DATE     TIMESTAMP   TWM    TALMC   A_B_C

Теперь я могу использовать ReadBetter с текстовым сканированием.

Спасибо за эту замечательную веб-страницу и помощь, которую я нашел здесь, во многих других сообщениях.


person Birk Birk    schedule 30.06.2011    source источник


Ответы (4)


В более новых версиях Matlab есть опция «разделить» для регулярного выражения, аналогичная разделению perl.

>> str = 'DATE      TIMESTAMP    T W M     T AL M C  A_B_C';
>> out = regexp(str, '  +', 'split')

out = 

    'DATE'    'TIMESTAMP'    'T W M'    'T AL M C'    'A_B_C'
person Rich C    schedule 30.06.2011

Более простым решением для анализа вашей строки было бы использование функции REGEXP для найдите индексы, в которых у вас есть 2 или более пробельных символа в строке, используйте эти индексы, чтобы разбить вашу строку на массив строк с помощью функции MAT2CELL, затем используйте функцию STRTRIM для удаления пробелов в начале и конце каждой подстроки. Например:

>> str = 'DATE      TIMESTAMP    T W M     T AL M C  A_B_C';
>> cutPoints = regexp(str,'\s{2,}');
>> cellArr = mat2cell(str,1,diff([0 cutPoints numel(str)]));
>> cellArr = strtrim(cellArr)

cellArr = 

    'DATE'    'TIMESTAMP'    'T W M'    'T AL M C'    'A_B_C'
person gnovice    schedule 30.06.2011

Я думаю, что вы слишком все усложняете. Просто используйте:

fid = fopen('pathandnameoffile');
textscan(fid,'%s','Delimiter','\t');

В приведенном выше примере предполагается, что в качестве разделителей используются табуляции. При необходимости измените его на что-то другое.

person hgus1294    schedule 30.06.2011
comment
Спасибо, но файлы, которые мне приходится открывать, странные (по крайней мере, для меня). Все простые способы открыть файлы у меня не сработали, так что в итоге я прочитал построчно, а затем столкнулся с проблемой, описанной выше. Может быть, они как-то повреждены, или их огромный размер (по 80 МБ каждый) вызывает у Matlab головную боль. - person Birk Birk; 30.06.2011

Вот один из способов прочитать ваш файл:

файл.dat

DATE      TIMESTAMP    T W M     T AL M C  A_B_C
DATE      TIMESTAMP    T W M     T AL M C  A_B_C
DATE      TIMESTAMP    T W M     T AL M C  A_B_C
DATE      TIMESTAMP    T W M     T AL M C  A_B_C
DATE      TIMESTAMP    T W M     T AL M C  A_B_C
DATE      TIMESTAMP    T W M     T AL M C  A_B_C

Код МАТЛАБ:

fid = fopen('file.dat', 'rt');
C = textscan(fid, '%s %s %c%c%c %c%2c%c%c %s');
fclose(fid);
C = [ C{1}, C{2}, ...
    cellstr( strcat(C{3},{' '},C{4},{' '},C{5}) ), ...
    cellstr( strcat(C{6},{' '},C{7},{' '},C{8},{' '},C{9}) ), ...
    C{10}
]

Результирующий массив ячеек:

C = 
    'DATE'    'TIMESTAMP'    'T W M'    'T AL M C'    'A_B_C'
    'DATE'    'TIMESTAMP'    'T W M'    'T AL M C'    'A_B_C'
    'DATE'    'TIMESTAMP'    'T W M'    'T AL M C'    'A_B_C'
    'DATE'    'TIMESTAMP'    'T W M'    'T AL M C'    'A_B_C'
    'DATE'    'TIMESTAMP'    'T W M'    'T AL M C'    'A_B_C'
    'DATE'    'TIMESTAMP'    'T W M'    'T AL M C'    'A_B_C'
person Amro    schedule 30.06.2011