Как я могу прочитать текстовый файл в Matlab и сделать его списком? - PullRequest
2 голосов
/ 14 июня 2010

У меня есть текстовый файл в формате

 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"

Я хотел бы прочитать текстовый файл в Matlab и составить список с информацией из строкового гена в качестве начальной точки для каждого элемента в списке. Таким образом, для этого примера в списке будет 3 элемента. Я попробовал несколько вещей и не могу заставить это работать. У кого-нибудь есть идеи, что я могу сделать?

1 Ответ

2 голосов
/ 14 июня 2010

Вот краткое предложение для алгоритма:

  1. Откройте файл с помощью fopen
  2. Начните чтение строк с fgetl, пока не найдете строку, начинающуюся с 'CDS'.
  3. Сохраняйте строки чтения, пока не получите другую строку, начинающуюся с 'gene'.
  4. Для всех строк между строкой в ​​(2) и в (3)
    • найдите строку между '/' и '='.Это имя поля
    • найти строку между кавычками.Это значение поля
  5. Увеличьте счетчик на единицу и начинайте с # 2, пока вы не закончите чтение файла

Эти команды могутбыть полезным:

  • Чтобы найти строку, заключенную в определенные символы, используйте, например, regexp(lineThatHasBeenRead,'/(.+)=','tokens','once')
  • Чтобы создать структуру вывода, используйте динамические имена полей, например, output(ct).(fieldname) = value;

РЕДАКТИРОВАТЬ

Вот код.Я сохранил ваш пример как «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) = [];
...