matlab - 使用 MATLAB 提取文本文件中 "Data starts on next line:"以外的数据

标签 matlab text

我正在尝试使用 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 , cell2matfclose帮助您做到这一点。

类似这样的事情:

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/

相关文章:

user-interface - 如何在 GUI Layout Toolbox 创建的选项卡中使用 EasyGUI 的功能?

Matlab 图形用户界面 : How to update handles structure?

python - PEP8 的实际用途是什么?为什么我必须缩短行数?

c++ - 在 Visual Studio 中直接调用 MATLAB(多线程)

matlab - 倍频程/Matlab : Extend a vector making it repeat itself?

matlab - 矩阵中的前 n 行?

javascript - JQuery 更改文本

c++ - 使用 C++ 更改 qml 文件中文本区域的文本

c# - 我可以从另一个程序的内存中获取字符串吗?

Python:EOFError:读取一行时为EOF