0

我有多个文本文件,每个都是模拟的结果。该文件的内容如下:

Parameter_1 = value
Parameter_2 = value
.....

Test 1
Min: value
Max: value
Average: value

Test 2
Min: value
Max: value
Average: value

每个文件包含具有不同值的相同类型的参数,当然测试值也不同。

我需要能够将这些数据导入 Matlab。我想在 Matlab 中做的是能够创建参数图表(x 轴)和测试结果。例如,变化Test 1 Min时的值图表Parameter_1意味着选择 n 个文件,其中只有 Parameter_1 不同,并比较 Test 1 Min 结果。

这是我的问题:我应该如何在我的文本文件中组织这些数据,以便轻松导入到 Matlab?我是 Matlab 的新手,所以我不知道什么是最好的方法。

任何可以帮助我入门的想法都会很棒。谢谢!

4

3 回答 3

3

您的文件根本没有问题。您将需要编写一个解析器。但不要害怕它不是太难。

正则表达式对此非常有用。我需要阅读一些内容才能掌握它 - 但它非常强大。

我会使用这样的代码:

fid = fopen('myfile.txt');
result = {};
result_entry=[];
while 1
    tline = fgetl(fid);
    if ~ischar(tline), break, end

    r = regexp(tline,'^(?<key>\w+)\W*=\W*(?<value>.*?)\W*$','names');
    if ~isempty(r)
    parameter_list.(r.key) = r.value;
    continue
    end

    % does a new entry start?
    r = regexp(tline,'^Test\W+(?<num>\d+)\W*$','names');
    if ~isempty(r)
        result = [result,{result_entry}];
        result_entry = struct('TestNumber',r.num);
        continue
    end

    r = regexp(tline,'^(?<key>\w+)\W*:\W*(?<value>.*?)\W*$','names');
    if ~isempty(r)
        result_entry.(r.key) = r.value;
    end
end
fclose(fid);
于 2012-08-16T13:58:15.140 回答
2

“组织数据的最佳方式”是一个非常有争议的问题。如果你问 10 个人,你会得到 11 个不同的答案。它通常取决于数据以及您可用于导入和导出数据的功能。

话虽如此,Matlab 在导入纯数字数据方面表现出色(哈,没有双关语)。如果您可以将文件组织为仅由数字组成,那么快速的“加载”、“dlmread”或“csvread”命令将导入它们。包含文本数据会使事情变得相当复杂。

例如,如果您的文件非常一致,您可以像这样组织文件:

Param1Value,Param2Value,Param3Value
1,Test1min,test1max,test1average
2,Test2min,test2max,test2average

如果示例中的所有文本都是简单的数值(整数或浮点数),则很容易导入 Matlab。您会知道第一行包含您的参数值

data = csvread('input.csv');
params = data(1,:);

您可以快速提取测试数字、最小值、最大值和平均值。

tests = data(2:end,1);
mins = data(2:end,2);
maxs = data(2:end,3);
avgs = data(2:end,4);

但这一切都取决于您在输出端的灵活性。

于 2012-08-16T13:49:16.443 回答
0

只是一个想法 - 类似于 JSON,您可以将您的保存为有效的 matlab m 文件。这样你就可以拥有所有结构特征,matlab 提供了一个相当快速的阅读。

于 2012-08-16T18:52:02.127 回答