How to use textscan with empty char fields

6 次查看(过去 30 天)
How can I use textscan with files that include these kind of lines, with empty chars?
m1 = 'HELLO,42.53,A,B,1,C'; % Only this works fine
m2 = 'HELLO,42.53,A,,1,C';
m3 = 'HELLO,42.53,A,B,1,';
m4 = 'HELLO,42.53,,,1,C';
pattern = 'HELLO%f%c%c%f%c';
delimiter = ',';
[C1, pos1] = textscan(m1, pattern, 'Delimiter', delimiter)
C1 = 1×5 cell array
{[42.5300]} {'A'} {'B'} {[1]} {'C'}
pos1 = 19
[C2, pos2] = textscan(m2, pattern, 'Delimiter', delimiter)
C2 = 1×5 cell array
{[42.5300]} {'A'} {','} {[1]} {'C'}
pos2 = 18
[C3, pos3] = textscan(m3, pattern, 'Delimiter', delimiter)
C3 = 1×5 cell array
{[42.5300]} {'A'} {'B'} {[1]} {0×1 char}
pos3 = 18
[C4, pos4] = textscan(m4, pattern, 'Delimiter', delimiter)
C4 = 1×5 cell array
{[42.5300]} {','} {'1'} {0×1 double} {0×1 char}
pos4 = 16
  1 个评论
Adam Danz
Adam Danz 2021-11-18
Since this doesn't answer the question, How can I use textscan ..., I'll leave a comment rather than an answer.
A workaround is to use strsplit and then some post-processing to convert chars to numbers.
m1 = 'HELLO,42.53,A,B,1,C';
m2 = 'HELLO,42.53,A,,1,C';
m3 = 'HELLO,42.53,A,B,1,';
m4 = 'HELLO,42.53,,,1,C';
cleanStrFcn = @(s)[str2double(s{2}),s(3:end)];
s1 = cleanStrFcn(strsplit(m1,',','CollapseDelimiters',false))
s1 = 1×5 cell array
{[42.5300]} {'A'} {'B'} {'1'} {'C'}
s2 = cleanStrFcn(strsplit(m2,',','CollapseDelimiters',false))
s2 = 1×5 cell array
{[42.5300]} {'A'} {0×0 char} {'1'} {'C'}
s3 = cleanStrFcn(strsplit(m3,',','CollapseDelimiters',false))
s3 = 1×5 cell array
{[42.5300]} {'A'} {'B'} {'1'} {0×0 char}
s4 = cleanStrFcn(strsplit(m4,',','CollapseDelimiters',false))
s4 = 1×5 cell array
{[42.5300]} {0×0 char} {0×0 char} {'1'} {'C'}

请先登录,再进行评论。

采纳的回答

Jeremy Hughes
Jeremy Hughes 2021-11-18
The format specifier %c always reads one character, no matter what that character is. What you likely want it %s, which reads all the characters up to the next matching delimiter.
  2 个评论
Stephen23
Stephen23 2021-11-18
str = sprintf('%s\n', 'HELLO,42.53,A,B,1,C', 'HELLO,42.53,A,,1,C', 'HELLO,42.53,A,B,1,', 'HELLO,42.53,,,1,C')
str =
'HELLO,42.53,A,B,1,C HELLO,42.53,A,,1,C HELLO,42.53,A,B,1, HELLO,42.53,,,1,C '
out = textscan(str, 'HELLO,%f%s%s%f%s', 'Delimiter',',');
out{:}
ans = 4×1
42.5300 42.5300 42.5300 42.5300
ans = 4×1 cell array
{'A' } {'A' } {'A' } {0×0 char}
ans = 4×1 cell array
{'B' } {0×0 char} {'B' } {0×0 char}
ans = 4×1
1 1 1 1
ans = 4×1 cell array
{'C' } {'C' } {0×0 char} {'C' }
Joan Vazquez
Joan Vazquez 2021-11-22
Thanks Jeremy and thanks Stephen for the examples

请先登录,再进行评论。

更多回答(0 个)

标签

产品


版本

R2021b

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by