2014-09-29 104 views
1

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

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

D1: Age 

Mean age: 33 
Median : 
. 
. 
. 

D2: weight 

我只是想从文本文件中挑选出这些名字,并创建一个表与真实变量名。

有什么建议吗?

+0

使用'fgets'逐行读取文件(http://www.mathworks.nl/help/matlab/ref/fgets.html)。如果该行的开始符合D1,...,DA3(使用'regexp':http://www.mathworks.nl/help/matlab/ref/regexp.html),则选择':'后面的部分。 – MeMyselfAndI 2014-09-29 11:13:39

+0

这个问题是我得到了很多无用的信息,如果我在':'之后选择零件。另外,一些变量名称有不同的长度 – enigmae 2014-09-29 11:20:33

+1

那么,这就是为什么你应该使用'regexp'。例如,'regexp(line,'^ [A-Z] * \ d *:')'表示您的行以一个或多个大写字母开头,后跟一个或多个数字,而不是冒号。 – MeMyselfAndI 2014-09-29 11:37:57

回答

1

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

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 

之间的5号线通过这个循环,你应该有一个变量,名为dataLabels保存所有标签的结束。现在,您实际上可以非常轻松地确定哪个标签与哪个数据集 提供的数据仍然是相同的顺序。索引对于数据的标签是相同的。

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

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

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

话虽这么说,而正则表达式是灵活的,如果你可以用一个字面函数调用替换逃脱它,它通常是更好地做到这一点。正则表达式的效率取决于程序员的技能,而内置函数通常由世界上一些更好的程序员进行测试。另外,如果你想回去改变它,正则表达式很难理解。 当然有些时候,正则表达式是惊人的,我只是不相信这是其中的一次。

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的不支持表。