我试图使用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行)来节省时间?
答案 0 :(得分:2)
您始终可以打开文件并循环浏览文件,直至找到Data starts on the next line:
。一旦你在那里,你可以将这些值读入矩阵。您可以结合使用fopen
,strfind
,fgetl
,textscan
,cell2mat
和fclose
来帮助您实现这一目标。
这样的事情:
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