2014-09-29 3 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

+0

문제는':'다음에 부품을 선택하면 쓸모없는 많은 정보를 얻게된다는 것입니다. 또한 변수 이름의 길이가 다르다. – enigmae

+1

글쎄, 왜냐하면 너는'regexp'를 사용하기 때문이다. 예를 들어'regexp (line, '^ [A-Z] * \ d * :')'는 줄이 하나 이상의 대문자로 시작하고 뒤에 하나 이상의 자릿수와 콜론이 오는 것을 나타냅니다. – MeMyselfAndI

답변

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 's는 돌아가서 변경하려는 경우 이해하기가 더 어렵습니다. 물론 Regex 's가 훌륭 할 때가 있습니다. 나는 이것이 그 시대 중 하나라고 확신하지 못했습니다.

0

내 이전 의견의 접근 방법의 실현하는 것이 : 나는 테이블을 지원하지 않는 matlab에 버전이 있기 때문에 내가 당신을 위해 테이블에 결과 varNames를 넣어 기운 다

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); 

.