2014-09-29 124 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的不支持表。