MATLAB中的变量标签

时间:2014-09-29 11:06:22

标签: matlab data-extraction

我有一个巨大的二进制数据表data= {1000 x 1000}。 这些表的变量名称被编码为例如D1,D2,...,DA2,DA3,...,其真实标签在.txt文件中给出。

.txt文件还包含一些文本,例如:

D1: Age

 Mean age: 33
 Median : 
 .
 .
 .

D2: weight

我只想从文本文件中选择这些名称,并创建一个包含实际变量名称的表。

有什么建议吗?

2 个答案:

答案 0 :(得分:1)

如果每个标签之间存在特定数量的行,则可以通过读取文件并循环相关行来提取它们。对于每个标签,使用strsplit()提取标签很简单 例如假设每个标签之间有5行

uselessLines = 5;
% imports as a vertical matrix with each line from the file.
dataLabelsFile = importdata(filename);

% get the total number of lines
numLines = size(dataLabelsFile);

% pre-allocate array for labels, a cell is used for a string
dataLabels = cell(ceil(numLines/(uselessLines+1)));

% use a seperate counting variable
m = 1;

% now, for each label, we add it to the dataLabels matrix
for i=1:(uselessLines+1):numLines
    line = strsplit(dataLabelsFile{i}); % by default splits on whitespace
    dataLabels(m) = line(2);
    m = m + 1;
end

在该循环结束时,您应该有一个名为dataLabels的变量,它包含所有标签。现在,您可以非常轻松地确定哪个标签与哪组数据相关 只要它们仍处于同一顺序。标签与数据的索引相同。

如果标签间距均匀,可以尝试这种方法。

但是,如果标签是随机数行,那么您可能想要使用正则表达式进行检查,就像我下面的人所建议的那样。然后你只需用这样的东西替换循环的最后两行。

...
    if (regular expression matched)
        dataLabels(m) = line(2);
        m = m + 1;
    end
...

话虽如此,虽然正则表达式是灵活的,但如果你可以通过字面上的一个函数调用来替换它,那么通常这样做会更好。正则表达式的效率取决于程序员的技能,而内置函数通常由世界上一些更好的程序员测试。此外,如果您想要返回并更改它,则很难理解正则表达式。 当然有时候Regex很棒,我只是不相信这是其中一次。

答案 1 :(得分:0)

我之前评论中的方法实现:

fid = fopen(filename);

varNames = cell(0);
proceed = true;
while proceed
    line = fgetl(fid);
    if ischar(line)
        startIdx = regexp(line,'(?<=^[A-Z]*\d*:)\s');
        if ~isempty(startIdx)
            varNames{end+1} = strtrim(line(startIdx:end)); %#ok<SAGROW>
        end
    else
        proceed = false;
    end
end

fclose(fid);

我无法将结果varNames放在一个表格中,因为我有一个不支持表格的Matlab版本。