Matlab: Как я могу читать строку, разделенную пробелами, но игнорируя одиночные пробелы (используя текстовое сканирование)? - PullRequest
2 голосов
/ 30 июня 2011

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

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

"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

Я хочу преобразовать это, например, с использованием textcan.Хотя я чувствую, что знаю 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 с текстовым сканированием.потрясающая веб-страница и помощь, которую я нашел здесь, во многих других сообщениях

Ответы [ 4 ]

2 голосов
/ 01 июля 2011

Более новые версии matlab имеют опцию 'split' для регулярного выражения, аналогичную расщеплению 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'
1 голос
/ 30 июня 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'
0 голосов
/ 30 июня 2011

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

file.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

Код MATLAB:

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'
0 голосов
/ 30 июня 2011

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

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

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

...