2012-11-09 23 views
2

我有一个关于阅读MATLAB中的格式不知道一个txt文件的问题,而是在txt文件的每一行总是这样开始:如何分离浮子用绳子被togetter写 - MATLAB

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变化;你不知道这个模式。

+0

情况在很好的解释,那么你现在的问题到底是什么? –

回答

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 
+0

绝对好看,有效和紧凑! – Acorbe

+0

@Acorbe:必须承认,'regexp'只是真棒:) –

+0

我同意。我真的必须熟悉它。 – Acorbe

0

我不知道我已经正确地解释你的问题。在我看来,你有一个可变数目的令牌,N或N + 1(N + M,也许?),在每行文本。

如果是的话,我会建议根据从各行提取标记的方法。

考虑一下:

  1. 您使用fgets来提取文件的每一行;
  2. 您使用strtok反复单独标记(即记号化你的字符串可以使用' '作为标记分隔符。);
  3. ,因为你有固定的初始模式,你可能要重新合并的第一N个令牌,并分析它们,你已经这样做了。然后,您可能需要检查位置N + 1中的令牌是否存在并最终解析它。