Yet another TEXTSCAN question...
Show older comments
Example string:
s = ['"1","2","3"' 10 '"","2","3"' 10 '"1","","3"' 10 '"1","2",""' 10 '"","",""' 10]
s =
'"1","2","3"
"","2","3"
"1","","3"
"1","2",""
"","",""
'
I want to extract columns as either cellstring or as numbers, using textscan (because it is fast). I can cheat and do this with the following:
t=textscan(strrep(s,'"',''),'%f%f%f','Delimiter',','); [t{:}] %as number
ans =
1 2 3
NaN 2 3
1 NaN 3
1 2 NaN
NaN NaN NaN
t=textscan(strrep(s,'"',''),'%s%s%s','Delimiter',','); [t{:}] %as string
ans =
5×3 cell array
{'1' } {'2' } {'3' }
{0×0 char} {'2' } {'3' }
{'1' } {0×0 char} {'3' }
{'1' } {'2' } {0×0 char}
{0×0 char} {0×0 char} {0×0 char}
But how to do it without strrep? so as to operate on file_id directly..
I have spent hours, thinking I've almost got it, 1 million permutations later no joy.. :'( :'( :'(
Answers (2)
Let textscan do the equivalent strrep for you...
>> fmt1=repmat('%f',1,3);
>> t=cell2mat(textscan(s,fmt1,'delim',',','collectout',1,'whitespace','"'))
t =
1 2 3
NaN 2 3
1 NaN 3
1 2 NaN
NaN NaN NaN
>> fmt2=repmat('%s',1,3);
>> t=textscan(s,fmt2,'delim',',','collectout',1,'whitespace','"')
t =
1×1 cell array
{5×3 cell}
>> t{:}
ans =
5×3 cell array
{'1"' } {'2"' } {'3"' }
{0×0 char} {'2"' } {'3"' }
{'1"' } {0×0 char} {'3"' }
{'1"' } {'2"' } {0×0 char}
{0×0 char} {0×0 char} {0×0 char}
>>
7 Comments
Serge
on 28 May 2018
Serge
on 28 May 2018
To read them as char use %q instead of %s, which will automatically ignore the double quotes:
out = textscan(s, '%q%q%q', 'Delimiter',',', 'CollectOutput',1)
dpb
on 28 May 2018
+1 Stephen; forgot about '%q'.
Serge, it works to reproduce your suggested/requested output for the strings case; the alternative posted works for numeric.
Serge
on 28 May 2018
Jeremy Hughes
on 29 May 2018
If the numbers are always surrounded by double-quotes, try this,
t = textscan(s,'"%f""%f""%f"','Delimiter',',')
or,
t = textscan(s,'%f%f%f', 'Delimiter',',','Whitespace',' \t"')
There's a lot of knobs in textscan. If you have a file with this kind of data, I suggest:
opts = detectImportOptions(filename)
t = readtable(filename)
HTH,
Jeremy
1 Comment
Serge
on 29 May 2018
Categories
Find more on Matrix Indexing in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!