MATLAB中的变量标签
问题描述:
我有一个巨大的表data= {1000 x 1000}
二进制数据。 他们的表的变量名称被编码为例如D1,D2,...,DA2,DA3,...
,它们的真实标签在.txt
文件中给出。MATLAB中的变量标签
的.txt
文件还包括一些文本例如:
D1: Age
Mean age: 33
Median :
.
.
.
D2: weight
我只是想从文本文件中挑选出这些名字,并创建一个表与真实变量名。
有什么建议吗?
答
如果每个标签之间有特定数量的行,则可以通过读取文件并在相关行上循环来提取它们。对于每个标签,使用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
...
话虽这么说,而正则表达式是灵活的,如果你可以用一个字面函数调用替换逃脱它,它通常是更好地做到这一点。正则表达式的效率取决于程序员的技能,而内置函数通常由世界上一些更好的程序员进行测试。另外,如果你想回去改变它,正则表达式很难理解。 当然有些时候,正则表达式是惊人的,我只是不相信这是其中的一次。
答
在我先前的评论的方法系统的实现:
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的不支持表。
使用'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
这个问题是我得到了很多无用的信息,如果我在':'之后选择零件。另外,一些变量名称有不同的长度 – enigmae 2014-09-29 11:20:33
那么,这就是为什么你应该使用'regexp'。例如,'regexp(line,'^ [A-Z] * \ d *:')'表示您的行以一个或多个大写字母开头,后跟一个或多个数字,而不是冒号。 – MeMyselfAndI 2014-09-29 11:37:57