如何将浮点与字符串分离,一起编写-matlab
我有一个关于在matlab中读取txt文件的问题,该文件的格式不知道,但txt文件中的每一行都是这样开始的:如何将浮点与字符串分离,一起编写-matlab,matlab,scanf,textscan,Matlab,Scanf,Textscan,我有一个关于在matlab中读取txt文件的问题,该文件的格式不知道,但txt文件中的每一行都是这样开始的: 2012-11-01 00:00:00.00 XX YY 00.000s 然后会记录一些不同的内容,例如,txt文件的外观可能会有所不同 Ex1: 2012-11-01 00:00:00.00 XX YY 00.000s 000.00deg 0.00rpm 0.00rpm Ex2: 2012-11-01 00:00:00.00 XX YY 00.000s
2012-11-01 00:00:00.00 XX YY 00.000s
然后会记录一些不同的内容,例如,txt文件的外观可能会有所不同
Ex1: 2012-11-01 00:00:00.00 XX YY 00.000s 000.00deg 0.00rpm 0.00rpm
Ex2: 2012-11-01 00:00:00.00 XX YY 00.000s 000.00deg 0.00rpm
Ex3: 2012-11-01 00:00:00.00 XX YY 00.000s 0.00deg 0.00rpm 0.00rpm 0.0deg
Ex4: 2012-11-01 00:00:00.00 XX YY 00.000s 0.00rpm
我使用textscan
处理此问题,并使用:
Fid = fopen('text.txt');
initfrm = {'%s%s%s%s %.3f %s'};
frm = repmat('%.2f %s',1,NCol);
frm = strcat(initfrm, frm);
Tmp = textscan(fid,frm{1});
Fclose(fid);
在该文件中,它计算了我们记录的列数(NCol
),但此处未显示
但有时文本文件包含0.0%
,例如:
Ex1: 2012-11-01 00:00:00.00 XX YY 00.000s 000.00deg 0.00rpm 0.00rpm 0.0%
现在,“%.2f”
不起作用。我不知道什么时候日志是这样的。当浮点数和字符串一起打印时,是否有更好的方法来分离它们;我只想收集数据(浮动),这样我就可以绘图了
当浮动值随%.2f和%.1f变化时,如何获取所有浮动值;你不知道这种模式 我不确定我是否正确地解释了你的问题。在我看来,每行文本中都有数量可变的标记,可以是N或N+1(可能是N+m?) 如果是这样的话,我会建议一种基于从每行提取令牌的方法 考虑这一点:
'
作为标记分隔符)李>
像这样导入文本真的很痛苦;通常,这是对您的字符串操作知识的一个很好的测试:) 我相信以下命令会很好地执行:
% Read in entire file as string
fid = fopen('yourFile.txt');
C = textscan(fid, '%s', 'delimiter', '');
fclose(fid);
C = C{1};
% Remove first part (from column 39 onwards in your example;
% adjust to match your actual data)
C = cellfun(@(x)x(39:end), C, 'UniformOutput',false);
% Remove unwanted junk
% NOTE: this removes all occurrences of 'rpm', 'deg',
% 's', and the trailing '0.0%'
C = regexprep(C, {'deg' 'rpm' 's' '([0-9]+\.[0-9]+%)$'}, '');
% Tokenize string and convert to double
C = cellfun(@(x)textscan(x, '%f'), C);
我用yourFile.txt
对其进行了测试:
Ex1: 2012-11-01 00:00:00.00 XX YY 00.000s 000.00deg 0.00rpm 0.00rpm
Ex2: 2012-11-01 00:00:00.00 XX YY 00.000s 000.00deg 0.00rpm
Ex3: 2012-11-01 00:00:00.00 XX YY 00.000s 0.00deg 0.00rpm 0.00rpm 0.0deg
Ex3: 2012-11-01 00:00:00.00 XX YY 00.000s 0.00deg 0.00rpm 0.00rpm 0.0deg 0.0%
Ex4: 2012-11-01 00:00:00.00 XX YY 00.000s 0.00rpm
Ex4: 2012-11-01 00:00:00.00 XX YY 00.000s 0.00rpm
带有上述命令的C
的最终内容如下
>> C{:}
ans =
0
0
0
0
ans =
0
0
0
ans =
0
0
0
0
0
ans =
0
0
0
0
0
ans =
0
0
ans =
0
0
这种情况解释得很好,那么你现在的问题到底是什么呢?绝对是好的、有效的、紧凑的@Acorbe:我得承认,
regexp
简直太棒了:)我同意。我真的必须熟悉它。真的很流畅的代码!我不明白它是如何处理百分比值的,即0.0%
。因为如果你有一个不止一个的例子,它无法处理它(在第一个之后停止)。我给你举个例子:Ex:2012-11-01 00:00:00.00 XX YY 00.000s 0.00deg 0.0%0.00rpm 0.00rpm 0.0deg 0.0%0.0%
Ans:00正确的Ans当然是:0 0 0 0@user1564762:Ah,可能有多个……嗯,在这种情况下,我认为删除regexprep
中的“$”
可以解决这一问题,但您必须测试这一点……是否要完全删除百分号no之前的值?还是应该将它们包括在结果中?