MATLAB Answers


how to separate strings from a datatable?

Asked by Jonathan Bijman on 11 Jun 2019
Latest activity Commented on by Walter Roberson
on 12 Jun 2019
Hello everyone
I'm trying to separate strings from a datatable, of one specific column that contains this for instance:
2019-04-22 Clean A8
and I want to separate date from the strings.
I used this commands:
But when I apply the last one appears this error:
First input must be either a character vector or a string scalar.
Which I don´t get it, because there are string in there? Aren´t they?
Do I have to work with datatable or cells?
Please help

  1 Comment

I would think the more fundamental question is how you got into this situation to begin with. Are you reading a file? If so can you use detectimportoptions and then readtable to read the data in correctly?

Sign in to comment.

2 Answers

Answer by Walter Roberson
on 12 Jun 2019
 Accepted Answer

tiempo = arrayfun(@strsplit, str, 'uniform', 0);


I wrote this
tiempo = arrayfun(@strsplit, r, 'uniform', 0);
tiempo_1 =arrayfun(@(V) V{1}, tiempo, 'uniform', 0)
And appears the same thing:
1 x 3 string
And when I click on it, appers the same as the picture.
The idea is the date appears as one column separate from the other ones, as a table or array (I dunno what's better)
on 12 Jun 2019
"I get a cell with 1 x 3 strings. But how can I extract only the date from there? "
Look at the content of the cell you asked to split on delimiters and your input array consists of three substrings, (surprise) strplit returned each substring in each row of a three-column cell array.
Hence, the first column contains the date, the second two the subsequent string data fields.
contains the time string.
cellfun(@(V) V{1}, tiempo, 'uniform', 0)

Sign in to comment.

Answer by dpb
on 12 Jun 2019

As the error message says, strsplit only operates on the strings class or char arrays--it can't handle either cell strings (the reason for which I do not understand) or the result of a table operation that returns a table...
>> Clean={'2019-04-22 Clean A8'}; % sample data
>> Clean=cell2table(Clean) % convert to table (if that is what mean with datatable; we're guessing)
Clean =
'2019-04-22 Clean A8'
>> Clean(:,1) % address the variable with numeric subscripting--returns another table
ans =
'2019-04-22 Clean A8'
>> strsplit(Clean(:,1)) % and strsplit can't deal with you already found out
Error using strsplit (line 80)
First input must be either a character vector or a string scalar.
>> Clean{:,1} % dereference with curlies {} to get content instead of table--
ans =
1×1 cell array
{'2019-04-22 Clean A8'}
>> strsplit(Clean{:,1}) % but, as error says it can't handle cellstr, either... :(
Error using strsplit (line 80)t
First input must be either a character vector or a string scalar.
>> strsplit(char(Clean{:,1})) % but it can handle a char() array as the message says
ans =
1×3 cell array
{'2019-04-22'} {'Clean'} {'A8'}
>> strsplit(string(Clean{:,1})) % or a string...
ans =
1×3 string array
"2019-04-22" "Clean" "A8"
>> strsplit(string(Clean(:,1))) % but notice you have to dereference the content or...
Error using string
Conversion to string from table is not possible.


Show 1 older comment
on 12 Jun 2019
Well, dunno...
What does
which -all string
Also, it still isn't absolutely clear what you started with--I made some assumptions that your original data was in a cellstr based on the error and that you were using a table because you used the word "datatable" but whether that means a MATLAB table class variable or not is not totally clear.
Now, above, it does appear to have started with a cell array and turned it to a table. The second assignment to the variable tiempo negates the first entirely--there's no point in it.
If I reproduce that with the table I created here, it works just fine...which Matlab release are you using? string is a relatively recent introduction.
Also, post what
whos Clean*
returns as well as
whos tiempo
after the second definition.
@Jonathan Bijman: please upload the variable tiempo in a .mat file by clicking the paperclip button.

Sign in to comment.