2

我有一个关于在 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在文件中,它计算了我们记录 了多少 col ( ),但这里没有显示

但有时文本文件包括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 变化时,如何获得所有浮点值;你不知道模式。

4

2 回答 2

2

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

我相信以下命令会做得很好:

% 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
于 2012-11-09T10:25:07.220 回答
0

我不确定我是否正确解释了您的问题。在我看来,每行文本中都有可变数量的标记,N 或 N+1(也许是 N+m?)。

如果是这样,我会建议一种基于从每一行中提取标记的方法。

考虑一下:

  1. 您用来fgets 从文件中提取每一行;
  2. 您用于strtok迭代分离标记(即,标记您的字符串。您' '用作标记分隔符);
  3. 因为你有一个固定的初始模式,你可能想要重新合并前 N 个标记并像你已经做的那样解析它们。然后,您可能想要检查位置 N+1 中的标记是否存在并最终解析它。
于 2012-11-09T09:49:17.843 回答