【问题标题】:Variable labels in MATLABMATLAB 中的变量标签
【发布时间】:2014-09-29 11:06:21
【问题描述】:

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

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

D1: Age

 Mean age: 33
 Median : 
 .
 .
 .

D2: weight

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

有什么建议吗?

【问题讨论】:

  • 使用fgets (mathworks.nl/help/matlab/ref/fgets.html) 逐行读取文件。如果行首与 D1、...、DA3 匹配(使用regexpmathworks.nl/help/matlab/ref/regexp.html),则选择: 之后的部分。
  • 问题是如果我在: 之后选择零件,我会得到很多无用的信息。此外,一些变量名有不同的长度
  • 嗯,这就是为什么你应该使用regexp。例如,regexp(line,'^[A-Z]*\d*:') 表示您的行以一个或多个大写字母开头,后跟一个或多个数字,而不是冒号。

标签: matlab data-extraction


【解决方案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 有时也很棒,我只是不相信这是其中之一。

【讨论】:

    【解决方案2】:

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

    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 版本。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-11-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多