我有一个巨大的二进制数据表data= {1000 x 1000}
。
这些表的变量名称被编码为例如D1,D2,...,DA2,DA3,...
,其真实标签在.txt
文件中给出。
.txt
文件还包含一些文本,例如:
D1: Age
Mean age: 33
Median :
.
.
.
D2: weight
我只想从文本文件中选择这些名称,并创建一个包含实际变量名称的表。
有什么建议吗?
答案 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版本。