Eric
Eric

Reputation: 429

Matlab strsplit by space and quotes

I have a string of variable names as shown below:

{'"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"'}

the double quotes are for the variable names with spaces or special characters between the words" and a single word variable doesn't have any quotes around them. The variables are separated by one space. Some variable names are just numbers.

At the end, I want to create a cell with strings as follows:

{'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'}

Upvotes: 0

Views: 395

Answers (3)

Eric
Eric

Reputation: 429

I ended up forcing myself to study little bit on regular expression and the following seems to be working well for what I'm trying to do:

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

Probably not as robust as I want since I'm specifically singling out a certain set of special characters only, but so far, I haven't seen other special characters other than those in the data sets I have.

Upvotes: 1

Suever
Suever

Reputation: 65460

You can use regexp to first split it into groups and then replace all space with _

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

Since your last variable isn't surrounded by quotes, you could do something like the following

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

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

Upvotes: 2

Akanksha
Akanksha

Reputation: 96

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

Then

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

The resultant cell array is str_q, which will give the names of the variables

str_q = 'abc_def_ghi' 'jkl_mno_pqr' 'stu_vwx' 'yz'

Upvotes: 0

Related Questions