试图解析一个相当复杂的文本文件

时间:2012-08-16 13:36:44

标签: matlab text-parsing

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

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值的图表意味着选择只有Parameter_1不同的n个文件,并比较Test 1 Min结果。

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

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

3 个答案:

答案 0 :(得分:3)

您的文件没有任何根本错误。您需要编写解析器。但不要担心这不是太难。

Regexp对此非常有用。我需要一点阅读才能掌握它 - 但它的功能非常强大。

我会使用这样的代码:

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);

答案 1 :(得分: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);

但这一切都取决于你在输出方面的灵活性。

答案 2 :(得分:0)

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