2017-09-21 17 views
4

의 내가 키/값 쌍과 문자 배열이 있다고 가정 해 봅시다. 실제 데이터는 파일에 있으며 많은 쌍을 가지고 있습니다.구조에서 키/값 쌍을 반환 할 수 있습니까?</p> <pre><code>ch = sprintf('name: Johnnsex: Mn') ch = 'name: John sex: M ' </code></pre> <p>이 그냥 샘플입니다

lns = regexp(ch, '(\w*):\s(.*?)\n', 'tokens'); 
for i = 1:numel(lns) 
    myStruct.(lns{i}{1}) = lns{i}{2}; 
end 

myStruct = 

    struct with fields: 

    name: 'John' 
    sex: 'M' 

이 달성 할 수있는 간단한 방법이 regexp(ch, expr, 'names')를 사용하는 것처럼, 거기 : 나는 다음 구조에 할당하는 for 루프를 사용하여 토큰을 얻을 수 regexp를 사용할 수 있습니까?

+0

키를 미리 알고 있습니까? 즉, 그들은 항상 '이름'과 '성'이 될 것입니까? – informaton

+0

_for_ 루프를 피하면 잠재적으로 성능이 향상 될 수 있습니다. –

+0

@informaton 나는 열쇠를 미리 모른다. regexp 문서에서 알려진 키가 필요한 것 같습니다. –

답변

5

단일 셀 어레이에 키/값 쌍을 수집하고 다음으로 그 내용을 전달하여 for 루프를 방지 할 수있는 comma-separated liststruct에 :

args = [lns{:}]; 
myStruct = struct(args{:}); 

그리고 출력 :

myStruct = 

    struct with fields: 

    name: 'John' 
    sex: 'M' 

regexp을 사용하지 않고 textscan을 사용하면 파일에서 읽을 수 있으므로 성능이 향상 될 수 있습니다.

strs = textscan(fileID, '%s', 'Delimiter', ':'); 
myStruct = struct(strs{1}{:}); 
+0

감사합니다. 필자는 75 쌍의 성능을 테스트했는데, 이것은 'for' 루프보다 약간 빠르다. 차이는 매우 미미하지만. –

+0

@ XiangruiLi :'regexp' 대신'textscan'을 사용하여 옵션을 추가했습니다. 성능 향상에 도움이되기를 바랍니다. – gnovice

+0

더 빠를 수도 있습니다. 하지만 내 경우에는'value '에 내부 공간이있을 수 있기 때문에'% s '을 사용할 수 없습니다. –