2013-08-28 166 views
3

我有存储为文本文件中的数据如下:Matlab的文本阅读

1377303313.298551: 1377303312.800000, **40.497522, -74.434818, 0.026000,** PS 

1377303313.320448: R255 1 

1377303313.369429: R255 1 

1377303313.419430: R255 1 

1377303313.468416: R255 1 

1377303313.676656: 1377303313.200000, **40.497521, -74.434819, 0.010000** PS 

1377303313.715420: R255 1 

1377303313.814361: R255 1 

我想我的文件看起来像这样:

1 255 **40.497522 -74.434818 0.026000** 1377303313.320448 

1 255 **40.497522 -74.434818 0.026000** 1377303313.369429 

1 255 **40.497522 -74.434818 0.026000** 1377303313.419430 

1 255 **40.497522 -74.434818 0.026000** 1377303313.468416 

1 255 **40.497521 -74.434819 0.010000** 1377303313.715420 

1 255 **40.497521 -74.434819 0.010000** 1377303313.814361 

总之,我需要大胆的部位要继续进行直到他们进行下一次PS测量,然后重复同样的事情。我真的很困难,我会感谢一些帮助!

在此先感谢。

+1

你能否证实有时是一个逗号您的数据后,PS之前,有时不是?或者是其中一行是错字? – Geodesic

回答

1

我很快把一些脚本放在一起。我认为你的输入文件有一个固定的格式,这意味着值的长度在行之间不会改变。这样可以更容易地从线条中提取所需的东西,比如“粗体部分”。如果它们不是固定的,则正规表达式可能是提取所需的,但脚本的一般结构不应改变。

disp(' '); 

fname = 'data.txt'; 

% desired output line format 
desiredlineTemplate = '1 255 %s %s\n'; 


boldPart = ''; 

fid = fopen(fname); 

% get first line 
tline = fgets(fid); 

if numel(tline) > 36 
    % check if first line in a file is a PS line 
    % based on its length. 
    % lines with PS are much longer than the lines without PS 
    % so we can use this information 

    % extract the "bold part" 
    boldPart = tline(39:end-4); 

    % remove commas 
    boldPart = strrep(boldPart,',',''); 
end 

while ischar(tline) 

    % disp(tline); 

    if numel(tline) == 1, 
     % enmpty lines have length of 1. At least 
     % when I tried this. If this is not the case for your 
     % text file, u can ignor this bit. 
     tline = fgets(fid); 
     continue; 
    end 


    % lines with PS are much longer than the lines without PS 
    % so we can use this information 
    if numel(tline) > 36 
     % this is a line with PS 
     % so extract "bold part" 
     boldPart = tline(39:end-4); 

     % remove comma 
     boldPart = strrep(boldPart,',',''); 

    else 
     % now we are in a line without PS. Thus need to reformat this line 
     % and add "bold part" extracted earlier. 

     % extract the first number in a line 
     % again based on ints length 
     firstNumber = tline(1:17); 

     % CONSTRUCT THE DISIRED LINE OUTPUT 
     desiredLine = sprintf(desiredlineTemplate, boldPart, firstNumber); 

     disp(desiredLine); 
    end 

    tline = fgets(fid); 

end 

fclose(fid); 

输出是:

>> 
1 255 40.497522 -74.434818 0.026000 1377303313.320448 

1 255 40.497522 -74.434818 0.026000 1377303313.369429 

1 255 40.497522 -74.434818 0.026000 1377303313.419430 

1 255 40.497522 -74.434818 0.026000 1377303313.468416 

1 255 40.497521 -74.434819 0.010000 1377303313.715420 

1 255 40.497521 -74.434819 0.010000 1377303313.814361 
+0

如果这些数字的大小不一样,那么函数fscanf将会非常有用。事实上,fscanf会简化上述过程,但我会把它留给别人来写。 – Cramer

+0

@Cramer yep,fscanf也可以使用。 – Marcin

+0

Thnaks很多!线条之间的值的长度会改变,但我会用代码来玩一下来解决!我很感激!! – user2727146