使用MATLAB提取“以外的数据”;数据从下一行开始:“quot;在文本文件中

使用MATLAB提取“以外的数据”;数据从下一行开始:“quot;在文本文件中,matlab,text,Matlab,Text,我试图使用Matlab从一个.txt文件中提取4列数据(在这种情况下,使用Matlab是不可协商的);但是,在感兴趣的数据之前有可变数量的标题文本。数据上方的行总是读取 Theta(deg)Phi(deg)Amp相位数据从下一行开始: 对于更多上下文,从标题到数据的转换如下所示…: Amp/相位漂移=-1.11 dB,2.7度 θ(度)φ(度)安培相位数据从下一行开始: -180.000 -90.000 16.842 -116.986 -179.000 -90.000 16

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

Theta(deg)Phi(deg)Amp相位数据从下一行开始:

对于更多上下文,从标题到数据的转换如下所示…:

Amp/相位漂移=-1.11 dB,2.7度
θ(度)φ(度)安培相位数据从下一行开始:
-180.000   -90.000    16.842  -116.986
-179.000   -90.000    16.837  -126.651
-178.000   -90.000    16.549  -137.274

最好的方法是什么?另外,是否有一种方法可以节省时间,只需在前200行文本中搜索短语
数据从下一行开始:

您始终可以打开文件并循环浏览文件,直到找到
数据从下一行开始:
。一旦你到了那里,你就可以把这些值读入矩阵。您可以使用、、和的组合来帮助您做到这一点

大概是这样的:

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
代码本身就说明了问题。但是,为了更详细,让我们逐行地讨论它

第一行打开数据文件进行读取。接下来,我们抓取文本文件的第一行,然后继续从该点开始检查,直到在该行找到
“数据从下一行开始”
的实例。我们将此逻辑放在
中,而
循环和
strfind
确定特定模式在某些文本中发生的位置。我们正在搜索的文本是文本文件中查询的行,我们想要的模式是
“数据从下一行开始”
。如果找不到要查找的内容,
strfind
返回一个空数组,因此我们使用
循环,而
循环直到
strfind
不返回空数组

我已经做了一些额外的检查,如果我们没有找到
“数据从下一行开始”
,我们什么也不做。如果到达文件末尾,
fgetl
将返回-1。如果我们遇到a-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

如果可以修改文本文件,只需在前面添加一个
%
注释文本文件的非数据部分即可。然后,您可以简单地将该文件加载到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

令人惊叹的!正是我需要的。谢谢你的详尽回答!