使用MATLAB提取数据超过"数据从下一行开始:"在文本文件中

时间:2015-08-04 19:36:05

标签: matlab text

我试图使用Matlab从.txt文件中提取4列数据(在这种情况下使用Matlab是不可协商的);但是,可变数量的标题文本在感兴趣的数据之前。数据上方的行始终为

Theta(deg) Phi(deg) Amp Phase Data starts on next line:

对于更多上下文,从标题到数据的转换看起来像这样......:

Amp/Phase drift   =  -1.11  dB,  2.7  deg


Theta(deg)  Phi(deg)    Amp     Phase   Data starts on next line:
 -180.000   -90.000    16.842  -116.986
 -179.000   -90.000    16.837  -126.651
 -178.000   -90.000    16.549  -137.274

最好的方法是什么?另外,是否有一种方法可以通过仅搜索短语Data starts on next line:的第一行(例如200行)来节省时间?

2 个答案:

答案 0 :(得分:2)

您始终可以打开文件并循环浏览文件,直至找到Data starts on the next line:。一旦你在那里,你可以将这些值读入矩阵。您可以结合使用fopenstrfindfgetltextscancell2matfclose来帮助您实现这一目标。

这样的事情:

f = fopen('data.txt', 'r'); %// Replace filename with whatever you're looking at

%// Go through each line in the text file until we find "Data starts on next line"
line = fgetl(f);
while isempty(strfind(line, 'Data starts on next line'))
    if line == -1 %// If we reach the end of the file, get out
        break;
    end
    line = fgetl(f);
end

%// File pointer is now advanced to this point.  Grab the data
if line ~= -1
    data = cell2mat(textscan(f, '%f %f %f %f'));
else
    disp('Could not find data to parse');
end

fclose(f); %// Close file

代码说明了一切。但是,为了详细,让我们逐行完成它。

第一行打开您的数据文件以供阅读。接下来,我们抓取文本文件的第一行,然后继续检查该点,直到我们在该行上找到'Data starts on next line'的实例。我们将此逻辑放在while循环中,strfind确定特定模式在某些文本中的位置。我们正在搜索的文本是文本文件中查询的行,我们想要的模式是'Data starts on next line'。如果我们找不到我们要查找的内容,strfind会返回一个空数组,因此我们使用while循环进行循环,直到strfind 返回一个空数组。

我已经添加了一些额外的检查,如果我们找不到'Data starts on next line'我们什么都不做。如果我们到达文件末尾,fgetl将返回-1。如果我们遇到-1,那意味着没有要解析的数据,所以我们只是保留它们的方式。

如果我们最终找到这个字符串,文件指针已经前进到现在有效的数字数据。我们使用textscan来读取此点之后的文本行,并使用有四列数据的事实,我们使用空格分隔%f来表示每行有4个浮点数。结果将为您提供一个4元素单元格数组,其中每个元素都是一列数据。要将结果转换为数值数组,您需要使用cell2mat执行此转换。此数据存储在名为data的变量中。我们终于关闭了文件,因为我们不再需要使用它了。

当我运行上面的代码并将示例文本数据放入名为data.txt的文件中时,这就是我得到的:

>> data

data =

 -180.0000  -90.0000   16.8420 -116.9860
 -179.0000  -90.0000   16.8370 -126.6510
 -178.0000  -90.0000   16.5490 -137.2740

答案 1 :(得分:0)

如果您可以修改文本文件,只需在前面添加%即可评论文本文件的非数据部分。然后你可以直接文件加载到matlab中。

具体而言:如果您的文件data.txt包含

% Amp/Phase drift   =  -1.11  dB,  2.7  deg
%
%
% Theta(deg)  Phi(deg)    Amp     Phase   Data starts on next line:
 -180.000   -90.000    16.842  -116.986
 -179.000   -90.000    16.837  -126.651
 -178.000   -90.000    16.549  -137.274

然后matlab将能够处理

data=load('data.txt');

并且此变量的内容将是

>> data

data =

 -180.0000  -90.0000   16.8420 -116.9860
 -179.0000  -90.0000   16.8370 -126.6510
 -178.0000  -90.0000   16.5490 -137.2740