2010-06-16 4 views
0

나는 목록으로 만들고 싶은 텍스트 파일을 가지고있다. 최근에이 주제에 관해 두 가지 질문을했습니다. 계속해서 문제가되는 것은 텍스트 파일을 구문 분석하려고하지만 섹션의 길이가 다르다는 것입니다. 그래서Matlab에서 텍스트 파일을 구문 분석하는 데 문제가 있습니다. 필드에 여러 줄을 입력 할 수있는 방법이 있습니까?

textscan를 사용할 수 없다 (FID '% S % S % S')

각 유전자의 길이가 변화하기 때문이다. 필드를 설정하는 코드를 사용할 때 첫 번째 유전자에서 아래의 "노트"필드에 대해 각 필드를 한 줄만 허용하므로 한 필드에서 여러 줄을 사용할 수 있기를 원하기 때문에 필드를 사용하는 데 문제가있었습니다. 그것들을 읽을 수 있어야합니다. 현재 색인에 관한 오류를 얻고 있습니다. 행렬 차원을 초과합니다.

fieldname = regexp (줄 {1}, '/ (. +) =', '토큰', '한 번');

값 = 정규식 (라인 {1}, "="[+) "$ (^]?"? '한번 ","토큰 ");

I 보는 다른 가능한 방법이 작업은 어떤 종류의 isLineEmpty를 사용하여 유전자를 나눌 수 있습니다. "메모"와 관련된 모든 정보를 얻을 수 있도록 필드 입력란에 여러 줄을 입력 할 수있는 방법이 있습니까? ? 또는 isLineEmpty를 사용하여 필드를 사용하여 생략 할 수있는 방법을?

gene   218705..219367 
       /locus_tag="Rv0187" 
       /db_xref="GeneID:886779" 
CDS    218705..219367 
       /locus_tag="Rv0187" 
       /EC_number="2.1.1.-" 
       /function="THOUGHT TO BE INVOLVED IN TRANSFER OF METHYL 
       GROUP." 
       /note="Rv0187, (MTCI28.26), len: 220 aa. Probable 
       O-methyltransferase (EC 2.1.1.-), similar to many e.g. 
       AB93458.1|AL357591 putative O-methyltransferase from 
       Streptomyces coelicolor (223 aa); MDMC_STRMY|Q00719 
       O-methyltransferase from Streptomyces mycarofaciens (221 
       aa), FASTA scores: opt: 327, E(): 2.4e-17, (35.9% identity 
       in 192 aa overlap). Also similar to Rv1703c, Rv1220c from 
       Mycobacterium tuberculosis." 
       /codon_start=1 
       /transl_table=11 
       /product="O-methyltransferase" 
       /protein_id="NP_214701.1" 
       /db_xref="GI:15607328" 
       /db_xref="GeneID:886779" 

gene   219486..219917 
       /locus_tag="Rv0188" 
       /db_xref="GeneID:886776" 
CDS    219486..219917 
       /locus_tag="Rv0188" 
       /function="UNKNOWN" 
       /experiment="experimental evidence, no additional details 
       recorded" 
       /codon_start=1 
       /transl_table=11 
       /product="transmembrane protein" 
       /protein_id="NP_214702.1" 
       /db_xref="GI:15607329" 

답변

2

아마 한 줄에 여러 줄 필드를 축소하는 간단한 래퍼 함수의 일종을 사용하는 것이 좋습니다 것입니다. SOMET hing like :

function l = readlongline(fh) 
quotesSeen = 0; 
done  = false; 
l   = ''; 
while ~done 
    tline = fgetl(fh); 
    if ~ischar(tline) 
     % Hit EOF 
     l = tline; 
     return 
    end 
    quotesSeen = quotesSeen + length(strfind(tline, '"')); 
    % Break if we've seen 0 or 2 quotes 
    done = any(quotesSeen == [0 2]); 
    l = [l, tline]; 
end 
end 

이것은 fgetl을 대체하기위한 것입니다.

관련 문제