2010-06-13 8 views
2

J'ai un fichier texte qui a le formatComment puis-je lire un fichier texte dans matlab et en faire une liste?

gene   complement(22995..24539) 
       /gene="ppp" 
       /locus_tag="MRA_0020" 
CDS    complement(22995..24539) 
       /gene="ppp" 
       /locus_tag="MRA_0020" 
       /codon_start=1 
       /transl_table=11 
       /product="putative serine/threonine phosphatase Ppp" 
       /protein_id="ABQ71738.1" 
       /db_xref="GI:148503929" 
gene   complement(24628..25095) 
       /locus_tag="MRA_0021" 
CDS    complement(24628..25095) 
       /locus_tag="MRA_0021" 
       /codon_start=1 
       /transl_table=11 
       /product="hypothetical protein" 
       /protein_id="ABQ71739.1" 
       /db_xref="GI:148503930" 
gene   complement(25219..26802) 
       /locus_tag="MRA_0022" 
CDS    complement(25219..26802) 
       /locus_tag="MRA_0022" 
       /codon_start=1 
       /transl_table=11 
       /product="hypothetical protein" 
       /protein_id="ABQ71740.1" 
       /db_xref="GI:148503931" 

Je voudrais lire le fichier texte dans Matlab et faire une liste avec les informations provenant du gène de la ligne comme point de départ de chaque élément dans la liste. Donc, pour cet exemple, il y aura 3 éléments dans la liste. J'ai essayé quelques petites choses et je n'arrive pas à faire fonctionner ça. Quelqu'un at-il des idées de ce que je peux faire?

Répondre

2

Voici une suggestion rapide pour un algorithme:

  1. Ouvrez le fichier avec fopen
  2. Commencez à lire avec des lignes fgetl jusqu'à ce que vous trouviez une ligne qui commence par 'CDS'.
  3. Maintenez les lignes de lecture jusqu'à ce que vous obteniez une autre ligne commençant par 'gene'.
  4. Pour toutes les lignes entre la ligne (2) et (3)
    • trouver la chaîne entre '/' et '='. C'est le nom de champ
    • trouver la chaîne entre les guillemets. Ceci est la valeur du champ
  5. Installation du compteur d'une unité, et à partir de # 2 jusqu'à ce que vous avez fini de lire le fichier

Ces commandes peuvent être utiles:

  • Pour trouver une chaîne délimitée par des caractères spécifiques , utilisez par exemple regexp(lineThatHasBeenRead,'/(.+)=','tokens','once')
  • Pour créer la structure de sortie , utilisez les noms de zone dynamiques , par ex. output(ct).(fieldname) = value;

EDIT

est ici un code. J'ai enregistré votre exemple en tant que 'test.txt'.

% open file 
fid = fopen('test.txt'); 

% parse the file 
eof = false; 
geneCt = 1; 
clear output % you cannot reassign output if it exists with different fieldnames already 
output(1:1000) = struct; % you may want to initialize fields here 
while ~eof 
    % read lines till we find one with CDS 
    foundCDS = false; 
    while ~foundCDS 
     currentLine = fgetl(fid); 
     % check for eof, then CDS. Allow whitespace at the beginning 
     if currentLine == -1 
      % end of file 
      eof = true; 
     elseif ~isempty(regexp(currentLine,'^\s+CDS','match','once')) 
      foundCDS = true; 
     end 
    end % looking for CDS 

    if ~eof 

     % read (and remember) lines till we find 'gene' 
     collectedLines = cell(1,20); % assume no more than 20 lines pere gene. Row vector for looping below 
     foundGene = false; 
     lineCt = 1; 
     while ~foundGene 
      currentLine = fgetl(fid); 
      % check for eof, then gene. Allow whitespace at the beginning 
      if currentLine == -1; 
       % end of file - consider all data has been read 
       eof = true; 
       foundGene = true; 
      elseif ~isempty(regexp(currentLine,'^\s+gene','match','once')) 
       foundGene = true; 
      else 
       collectedLines{lineCt} = currentLine; 
       lineCt = lineCt + 1; 
      end 
     end 

     % loop through collectedLines and assign. Do not loop through the 
     % gene line 
     for line = collectedLines(1:lineCt-1) 
      fieldname = regexp(line{1},'/(.+)=','tokens','once'); 
      value = regexp(line{1},'="?([^"]+)"?$','tokens','once'); 
      % try converting value to number 
      numValue = str2double(value); 
      if isfinite(numValue) 
       value = numValue; 
      else 
       value = value{1}; 
      end 
      output(geneCt).(fieldname{1}) = value; 
     end 
     geneCt = geneCt + 1; 
    end 
end % while eof 

% cleanup 
fclose(fid); 
output(geneCt:end) = [];