我有一個巨大的表data= {1000 x 1000}
二進制數據。 他們的表的變量名稱被編碼爲例如D1,D2,...,DA2,DA3,...
,它們的真實標籤在.txt
文件中給出。MATLAB中的變量標籤
的.txt
文件還包括一些文本例如:
D1: Age
Mean age: 33
Median :
.
.
.
D2: weight
我只是想從文本文件中挑選出這些名字,並創建一個表與真實變量名。
有什麼建議嗎?
我有一個巨大的表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