我正在尝试使用 Matlab 从 .txt 文件中提取 4 列数据(在这种情况下使用 Matlab 是不可协商的);然而,在感兴趣的数据之前有不同数量的标题文本。数据上方的行始终为
Theta(deg) Phi(deg) 放大器相位数据从下一行开始:
对于更多上下文,从 header 到数据的转换如下所示......:
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
最好的方法是什么?另外,是否有一种方法可以通过仅在前 200 行文本中搜索短语 Data Starts on 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
代码本身就说明了一切。不过,为了更详细,让我们逐行浏览一下。
第一行打开您的数据文件以供读取。接下来,我们抓取文本文件的第一行,然后从该点开始继续检查,直到我们在该行上找到 'Datastarts on next line'
的实例。我们将此逻辑放入 while
循环中,然后 strfind
确定特定模式在某些文本中发生的位置。我们要搜索的文本是文本文件中的查询行,我们想要的模式是'数据从下一行开始'
。如果我们没有找到要查找的内容,strfind
将返回一个空数组,因此我们将使用 while
循环进行循环,直到 strfind
不返回空数组。
我进行了一些额外的检查,如果我们找不到“数据从下一行开始”
,我们不会执行任何操作。如果我们到达文件末尾,fgetl
将返回 -1。如果我们遇到 -1,则意味着没有数据可供解析,因此我们将保持原样。
如果我们最终找到了该字符串,则文件指针已前进到现在存在有效数字数据的位置。我们使用 textscan
读取超过此点的文本行,并利用有四列数据的事实,我们使用 %f
用空格分隔来表示有每行有 4 个 float 。其结果将为您提供一个 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 - 使用 MATLAB 提取文本文件中 "Data starts on next line:"以外的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31817783/