2014-11-10 1 views
0

이상한 형식의 데이터로 가득 찬 거대한 텍스트 파일을 읽을 필요가 있습니다. 형식은 다음과 같이 간다 : 대신 8의 각 제목 아래 나는 하나 개의 데이터 집합으로 평균을해야 할 25 개 테스트를 실행하고있어 약 25,000 항목이 제외하고 그것의 요점은,이다기이하게 포맷 된 큰 텍스트 파일을 MATLAB으로 읽어들입니다.

//Header with Title Info 

//Header with Test1 Info 
//More Test1 Info 
0,-156.875956035285 
1.953125,-4.82866496038806 
3.90625,-8.93502887648155 
5.859375,-9.76964479822559 
7.8125,-14.9767168331976 
9.765625,-16.9949034672061 
11.71875,-19.2709033739316 
13.671875,-18.9948581866681 

//Header with Test2 Info 
//More Test2 Info 
0,-156.875956035285 
1.953125,-4.82866496038806 
3.90625,-8.93502887648155 
5.859375,-9.76964479822559 
7.8125,-14.9767168331976 
9.765625,-16.9949034672061 
11.71875,-19.2709033739316 
13.671875,-18.9948581866681 

//Header with Test3 Info 
//More Test3 Info 
0,-156.875956035285 
1.953125,-4.82866496038806 
3.90625,-8.93502887648155 
5.859375,-9.76964479822559 
7.8125,-14.9767168331976 
9.765625,-16.9949034672061 
11.71875,-19.2709033739316 
13.671875,-18.9948581866681 

// End of Data 

.

기본적으로,이 순서의 데이터를 구문 분석 할 :

  1. 하는 첫 번째 줄
  2. 은 빈 줄을 인식 "데이터의 끝"에 대한 다음
  3. 확인으로 이동
  4. 하면 건너 뛰기 끝이 아니라 현재 줄과 다음 줄 건너 뛰기
  5. 현재 테스트 데이터 집합에 대한 새 배열 만들기
  6. 빈 줄에 도달 할 때까지 데이터 읽기, 2 단계로 돌아갑니다.

그런 다음이 모든 세트를 가장 효율적인 방법으로 함께 평균화하고 싶습니다.

데이터를 읽는 데 문제가 있습니다. 저는 csvread를 사용하거나 구분 된 값을 읽는 좀 더 일반적인 함수를 사용할 수 있다는 것을 알고 있지만, 모든 것을 할 수있는 우아하고 간결한 방법을 찾는 것에 매달려 있습니다.

나는이 시작 :

function [ data ] = graph(input_args) 
%Plot data 

myData = fopen('mRoom_fSweep_25points_center.txt'); 
data = textscan(myData,'%s'); 
fclose(myData); 
length(data) 
end 

그리고 난 그냥 문자열이 배열의 길이를 발견하고 작업의 전체 목록의에 대한 루프를 해결할 수있는 생각,하지만 난 할 수 없었다 이 점을 지나쳐라. 산출물은 나에게 이것을 계속주고 받았다 :

ans = 
    {772321x1 cell} 

나는 사용할 수없는 것들이다. 변수에이 값을 저장하려고하면 값은 1이됩니다. 셀 배열에 이상한 점이 있습니까? 여기에 누락 되었습니까?

+0

잘 모르겠지만 각 셀 요소에서 한 줄을 저장했다고 생각합니다. 데이터 (line, 1)로 해당 항목을 처리하려고 시도 했습니까? 당신은 중괄호 {}를 사용하여 셀 안의 데이터를 얻고 "보통"대괄호를 사용하여 셀 전체를 얻습니다. –

답변

4

"테스트 정보"줄에 정보가 필요하다고 가정합니까?

그렇다면, 당신은 두 개의 서로 다른 패턴으로 textscan를 실행해야합니다 : 하나는 정보 라인을 선택하고, 하나는 데이터 읽기 : 아래

info(1, end+1) = textscan(fid, '//%s','Delimiter', ''); 
data(1, end+1) = textscan(fid, '%f, %f', 'CollectOutput', true); 

입니다 내가 루프 오류로 포장 얼마나 처리 : 그런 다음 다음과 같이

% [info, data] = read_data(file_name): Read a file in funky format 
% 
% info and data are cells of same size 
function [info, data] = read_data(file_name) 
    [fid, msg] = fopen(file_name); 
    if fid<0 
     error('Unable to open file "%s": %s', file_name, msg); 
    end 
    % close the file no matter how we exit this funciton (error, 
    % ctrl-c,...) 
    finalize = onCleanup(@() fclose(fid)); 

    info = cell(1,0); 
    data = cell(1,0); 
    while true 
     info(1, end+1) = textscan(fid, '//%s','Delimiter', ''); 
     data(1, end+1) = textscan(fid, '%f, %f', 'CollectOutput', true); 

     if strcmpi(info{1,end}{end}, 'End of Data') 
      % End of data reached, exit here 
      info = info(1:end-1); 
      data = data(1:end-1); 
      break; 
     end 
     if isempty(data{1,end}) 
      % Empty data, but not 'End of data' marker. 
      % Replace this error with break to accept files with missing 
      % "end of data" tags 
      error('Empty data before "End of Data" line') 
     end 
    end 
end 

, 당신은 파일을 읽고 평균 계산할 수 있습니다 :

>> [info, data] = read_data('foo.txt') 
info = 
    {3x1 cell} {2x1 cell} {2x1 cell} 
data = 
    [8x2 double] [8x2 double] [8x2 double] 


>> info{3} 
ans = 
    'Header with Test3 Info' 
    'More Test3 Info' 

>> all_data = cellfun(@(d) d(:,2), data, 'UniformOutput', false); all_data = [all_data{:}] 
all_data = 
-156.8760 -156.8760 -156.8760 
    -4.8287 -4.8287 -4.8287 
    -8.9350 -8.9350 -8.9350 
    -9.7696 -9.7696 -9.7696 
    -14.9767 -14.9767 -14.9767 
    -16.9949 -16.9949 -16.9949 
    -19.2709 -19.2709 -19.2709 
    -18.9949 -18.9949 -18.9949 

>> mean(all_data, 2) 
ans = 
-156.8760 
    -4.8287 
    -8.9350 
    -9.7696 
    -14.9767 
    -16.9949 
    -19.2709 
    -18.9949 
+0

이것은 믿을 수 없다, 나는 더 철저한 응답을 상상할 수 없었다, 고마워! – jephex

+0

+1 좋은 답변이지만 특별히 onCleanup을 사용하여 파일을 닫는 데는 문제가 없습니다. 느슨하게 형식이 지정된 파일을 가져올 때 좋은 방법입니다. – Hoki