令牌是空时Textscan函数忽略了最后的分隔符

36视图(30天)
德里克。沃尔夫
德里克。沃尔夫 2023年5月15日在十八12
编辑: 里克 2023年5月17日在7:04
% str = ' a, b, c ';%,收益率3令牌
% str = ' a, c ';%,收益率3令牌
str =“a, b,”;%不工作,收益率2令牌
行= textscan (str,“% q”,“分隔符”,”、“,“MultipleDelimsAsOne”,0);
disp({1}行)
{a} {b}
textscan功能似乎忽略了最后一个分隔符,如果令牌是空的。的a, b,应该3令牌,它只产生2

答案(2)

里克
里克 2023年5月15日18:26
编辑:里克 2023年5月17日在7:04
据我所知,这是目标功能。它无法匹配一个空数组的格式规范,所以跳过。
如果你想要落后于空令牌,你可以考虑split()函数,或者正则表达式()与分裂的输出。
编辑:在这里你有例子我的意思。
str {1} =“a, b, c”;
str {2,} =“a, c”;
str {3 1} =“a, b,”;
正则表达式(str,”、“,“分裂”)%三个令牌
ans =3×1单元阵列
{1×3细胞}{1×3细胞}{1×3细胞}
分割(str,”、“)
ans =3×3单元阵列
{a} {b} {' c '} {a}{0×0字符}{' c '} {a} {b}{0×0字符}
%显示您的解决方案工作
cellfun (@ (x) disp (textscan ([x”、“),“% q”,“分隔符”,”、“,“MultipleDelimsAsOne”,0)),str)
{3×1细胞}{3×1细胞}{3×1细胞}
正如你所看到的,每个解决方案返回3令牌,但是都在一个稍微不同的格式。
4评论
里克
里克 2023年5月16日17:50
这工作。
关于你的错误报告:因为当前行为匹配文档中的描述,我不知道这可以归类为一个错误。你可以称之为一个增强请求。
无论哪种方式,你的主要问题是解决。只是知道textscan将尝试阅读你的格式,不令牌。如果你想标记你需要类似的regexp。

登录置评。


沃尔特·罗伯森
沃尔特·罗伯森 2023年5月16日20:40
文件名= tempname () +. txt”;
str = {12453年,c '};
writeline (str,文件名);
fid = fopen(文件名,“r”);
datacell = textscan (fid检测器,“% % f”, 1“分隔符”,”、“,“MultipleDelimsAsOne”,0);
休息= char(从文件中读(fid,[1正],‘* uchar‘));
文件关闭(fid);
datacell
datacell =1×2单元阵列
{[12]}{[453]}
休息
休息=
“c”
这告诉我们什么呢?它告诉我们,textscan完成处理的格式后,检查输入流,使用空格和分隔符的第一个副本,然后停止。
在你的例子中在处理的a、b % q首先处理 一个 的% q格式,然后吃的分隔符,离开“b”的输入流。没有指定数再次尝试处理,读取 b % q格式,吃分隔符。没有指定数再次尝试处理。输入流是空的,所以它停止。是的,这 同样的事情会发生的“a、b”的情况下,没有最后的分隔符。
潜在的替代将是如果分隔符的缓冲区,并处理跳过一个领先的分隔符。但在这种情况下输入,b, c的会一样对待b, c,我似乎不太可能,你会希望是这样。
是的,textscan 可以 设计内部设置一个标志,指示一个分隔符已经见过的当前位置,但我不确定,将与期望。例如,如果输入 123年,美国广播公司(abc), <换行符> 456,def, 和格式 % f %问 与当前的行为会产生{{123;456},{' abc ';“def”}}。如果落后于分隔符调用missing-contents行为(你的解释),那么这将意味着123年应该接受% f是第一次处理,然后 美国广播公司 应该接受% q是第一次处理,然后空字段的末尾行应该接受并变成了南第二次% f处理,然后呢 456年 应该接受和转化为特征向量处理第二次% q,然后呢 def 应该触发一个格式不匹配% f处理,第三次停止扫描和离开 def, 在缓冲区。它可能有一个一致的方式处理,但这是预期和有用的是什么?

类别

找到更多的在字符和字符串帮助中心文件交换

标签

s manbetx 845


释放

R2021b

社区寻宝

找到宝藏在MATLAB中央,发现社区如何帮助你!

开始狩猎!