如何将浮点与字符串分离,一起编写-matlab

如何将浮点与字符串分离,一起编写-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

我有一个关于在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  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?)

如果是这样的话,我会建议一种基于从每行提取令牌的方法

考虑这一点:

  • 用于从文件中提取每一行
  • 您使用以迭代方式分隔标记(即,标记化字符串。您使用
    '
    作为标记分隔符)
  • 因为您有一个固定的初始模式,所以您可能希望重新合并前N个令牌,并像以前一样解析它们。然后,您可能需要检查位置N+1中的令牌是否存在,并最终解析它

  • 像这样导入文本真的很痛苦;通常,这是对您的字符串操作知识的一个很好的测试:)

    我相信以下命令会很好地执行:

    % 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之前的值?还是应该将它们包括在结果中?