2012-08-16 2 views
0

여러 텍스트 파일을 가지고 있는데, 각각은 시뮬레이션 결과입니다. 파일의 내용은 다음과 같습니다.상당히 복잡한 텍스트 파일을 구문 분석하려고 시도합니다.

Parameter_1 = value 
Parameter_2 = value 
..... 

Test 1 
Min: value 
Max: value 
Average: value 

Test 2 
Min: value 
Max: value 
Average: value 

각 파일에는 다른 값을 가진 동일한 유형의 매개 변수가 포함되어 있으며 물론 테스트 값도 다릅니다.

이 데이터를 Matlab으로 가져올 수 있어야합니다. Matlab에서 수행하고자하는 작업은 매개 변수 차트 (x 축)와 테스트 결과를 생성하는 것입니다. 예를 들어, 값의 차트는 Parameter_1이 변경되면 Parameter_1 만 다른 n 개의 파일을 선택하고 Test 1 Min 결과를 비교한다는 것을 의미합니다.

다음은 제 질문입니다. Matlab으로 가져 오기 쉽도록 텍스트 파일에 데이터를 구성해야합니까? 저는 Matlab에 익숙하지 않으므로 최선의 방법이 무엇인지 모릅니다.

시작하는 데 도움이되는 아이디어가 있으면 도움이 될 것입니다. 감사!

+0

텍스트 파일 간의 가변성은 무엇입니까? 좀 더 구체적으로 말하자면, 모든 파일은 같은 수의'Parameter_N'을 가지고 있습니까? 그들은 모두 '시험'의 숫자가 같은가요? 모든 테스트는 'Min', 'Max','Average'의 3 가지 값만 있습니까? – slayton

+0

파일마다 다른 매개 변수 값과 다른 테스트 값이 있습니다. 내 질문을 편집했습니다. – Yotam

+0

엑셀이나 CSV 파일을 사용해보십시오 – Gir

답변

2

"데이터를 구성하는 가장 좋은 방법은"매우 논쟁적인 질문입니다. 10 명에게 물으면 11 가지 답변을 얻을 수 있습니다. 종종 데이터를 가져오고 내보내는 데 사용할 수있는 데이터 및 기능에 따라 달라집니다.

Matlab은 순수한 수치 데이터를 가져 오는 데 탁월한 기능을 제공합니다. 파일이 숫자로만 구성되도록 구성 할 수 있으면 빠른 'load', 'dlmread'또는 'csvread'명령을 사용하여 파일을 가져옵니다. 텍스트 데이터를 포함하면 상황이 좀 더 복잡해집니다. 예를 들어

, 당신이 파일은 매우 일치하고이 같은 파일을 구성 할 수있는 경우 : 예의 모든 텍스트는 단순히 숫자 값 (정수 또는 수레)이다

Param1Value,Param2Value,Param3Value 
1,Test1min,test1max,test1average 
2,Test2min,test2max,test2average 

, 매우 것 Matlab으로 가져 오기 쉽습니다. 당신은 첫 번째 행이 매개 변수를 포함

data = csvread('input.csv'); 
params = data(1,:); 

가치를 알게 될 것입니다 그리고 당신은 신속하게 테스트 번호, 최소, 최대, 평균 값을 꺼내 수 있습니다.

tests = data(2:end,1); 
mins = data(2:end,2); 
maxs = data(2:end,3); 
avgs = data(2:end,4); 

하지만이 모든 힌트는 출력면에서 얼마나 유연한 지에 달려 있습니다.

+0

텍스트를 사용하면 숫자가 나타내는 매개 변수를 쉽게 알 수 있습니다. 또한 나는 다른 시뮬레이션에서 많은 텍스트 파일을 가지고있다. 엉망이 아닐까요? 어쨌든 당신의 조언을 염두에 두겠다. – Yotam

+0

글쎄, 출력 형식은 내가 결정할 수있다. – Yotam

3

파일에 근본적인 문제가 없습니다. 파서를 작성해야합니다. 하지만 두려워하지 말고 너무 힘들지 않습니다.

Regexp는 매우 유용합니다. 나는 그것의 걸림 새를 얻기 위해 약간의 독서를 가져 간다 - 그러나 그것은 믿어지지 않는 강력한 것이다.

나는 다음과 같은 코드를 사용합니다 :

fid = fopen('myfile.txt'); 
result = {}; 
result_entry=[]; 
while 1 
    tline = fgetl(fid); 
    if ~ischar(tline), break, end 

    r = regexp(tline,'^(?<key>\w+)\W*=\W*(?<value>.*?)\W*$','names'); 
    if ~isempty(r) 
    parameter_list.(r.key) = r.value; 
    continue 
    end 

    % does a new entry start? 
    r = regexp(tline,'^Test\W+(?<num>\d+)\W*$','names'); 
    if ~isempty(r) 
     result = [result,{result_entry}]; 
     result_entry = struct('TestNumber',r.num); 
     continue 
    end 

    r = regexp(tline,'^(?<key>\w+)\W*:\W*(?<value>.*?)\W*$','names'); 
    if ~isempty(r) 
     result_entry.(r.key) = r.value; 
    end 
end 
fclose(fid); 
+0

고마워, 너의 편이 많은 노력이다. 나는 정규식을 안다. 나는 Matlab을 처음 접한다. 내가 파이썬을 사용하고 출력 형식을 결정할 수 - 내 질문은 좋은 형식 무엇입니까? 감사! – Yotam

+0

글쎄, 내 경험에 비추어 볼 때 대부분의 텍스트 기반 형식은 훌륭하게 작동한다. 자바와 hdf5 용 툴은 자바를 사용하지 않는 한 매우 잘 수행되지 않습니다. – bdecaf

0

그냥 아이디어 - 유사한을 당신이 유효한 matlab에 m 파일을 저장 할 수 JSON 할 수 있습니다. 당신은 모든 구조의 기능을 가질 수있는 그런 식으로 MATLAB은 여전히 ​​빠른 독서를 제공합니다.