2016-10-05 3 views
0

У меня есть строка имен переменных, как показано ниже:Matlab strsplit пространством и цитирует

{'"NORM TIME SEC, SEC, 9999997" "ROD FORCE, LBS, 3000118" "ROD POS, DEG, 3000216" P_ext_chamber_press P_ret_chamber_press "GEAR#1 POS INCH" 388821 Q_valve_gpm P_return 3882992 "COMMAND VOLTAGE VOLT"'} 

двойные кавычки для имен переменных с пробелами или специальными символами между словами»и одно слово переменной Безразлично ... «т есть кавычки вокруг них переменные разделены одним пробелом Некоторые имена переменных только цифры

в конце концов, я хочу создать ячейку со строками следующим образом:

{'NORM_TIME_SEC_SEC_9999997','ROD_FORCE_LBF_3000118','ROD_POS_DEG_3000216','P_ext_chamber_press','P_ret_chamber_press','GEAR#1_POS_INCH','3388821','Q_valve_gpm','P_return','3882992','COMMAND_VOLTAGE_VOLT'} 
+1

Число двойных кавычек нечетное (как в 2 × n + 1 = нечетное). Разве это не беспорядок с вашей группой имен переменных? –

+0

Я этот @Suever отредактировал его. Последняя переменная yz не имеет двойных кавычек, и вот почему эта проблема сложна. – Eric

ответ

2

Вы можете использовать regexp сначала разбить его на группы, а затем заменить все пространство _

data = {'"abc def ghi" "jkl mno pqr" "stu vwx" yz"'}; 

% Get each piece within the " " 
pieces = regexp(data{1}, '(?<=\"\s*)([A-Za-z0-9]+\s*)*(?=\"\s*)', 'match'); 

% 'abc def ghi' 'jkl mno pqr' 


% Replace any space with _ 
names = regexprep(pieces, '\s+', '_'); 

% 'abc_def_ghi' 'jkl_mno_pqr' 

Update

Поскольку ваша последняя переменная не в кавычки, вы могли бы сделать что-то вроде следующего

pieces = strtrim(regexp(data, '[^\"]+(?=\")', 'match')); 
pieces = pieces{1}; 
pieces = pieces(~cellfun(@isempty, pieces)); 

% Replace spaces with _ 
regexprep(pieces, '\s+', '_') 
+3

Это пахнет динамическим именем переменных. Мой нос уже зудит, и он редко ошибается. – Adriaan

+0

'data = {'" abc def ghi "" jkl mno pqr "'};' а затем 'data = cell2mat (data);'? нет? –

+0

@Sardar_Usama Неясно, действительно ли это массив ячеек. Также 'regexp' и' regexprep' также принимают массивы ячеек – Suever

0

ул = { ' "ABC жзите" "JKL MnO PQR" "ст VWX" уг "'};

Затем

str_u = strrep(str,' ','_'); 
[str_q rest] = strtok(str_u,'"'); 
str_u = rest; 
while ~strcmp(rest,'') 
    [token rest] = strtok(str_u,'"'); 
    if ~(strcmp(token,'_')||strcmp(token,'')) 
     if strcmp(token{1,1}(1),'_') 
      token{1,1} = strrep(token{1,1},'_',''); 
     end 
     str_q = [str_q, token]; 
    end 
    str_u = rest; 
end 

Массив результирующая ячейка str_q, который даст имена переменных

str_q = 'abc_def_ghi' 'jkl_mno_pqr' 'stu_vwx' 'уг'

1

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

regexp(str,'(\"[\w\s\,\.\#]+\"|\w+)','match') 

Наверное, не такой надежный, как я хочу, так как я специально выделяю только определенный набор специальных символов, но до сих пор я не видел других специальных символов, кроме тех, что есть в наборах данных, которые у меня есть.

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