2015-04-01 2 views
0

У меня есть вопрос, перед которым я узнал. Я обнаружил, что реализация привела к списку строк, а не списку записей. В файле, который я обрабатываю, есть записи, которые выглядят;Как анализировать записи?

зр | P30375 | 1A01_GORGO Класс I антиген гистосовместимости Гого-А * 0101 альфа-цепь ОС = горилл горилл горилл РЕ = 2 SV = 1 MAVMAPRTLVLLLSGALALTQTWAGSHSMRYFSTSVSRPGRGEPRFIAVGYVDDTQFVRF DSDAASQRMEPRAPWIEQEGPEYWDRNTRNVKAHSQTDRVDLGTLRGYYNQSEDGSHTIQ RMYGCDVGSDGRFLRGYQQDAYDGKDYIALNEDLRSWTAADMAAEITKRKWEAAHFAEQL RAYLEGTCVEWLRRHLENGKETLQRTDAPKTHMTHHAVSDHEAILRCWALSFYPAEITLT WQRDGEDQTQDTELVETRPAGDGTFQKWAAVVVPSGQEQRYTCHVQHEGLPEPLTLRWEP SSQPTIPIVGIIAGLVLFGAVIAGAVVAAVRWRRKSSDRKGGSYSQAASSDSAQGSDVSL TACKV зр | P30443 | 1A01_HUMAN HLA класс 1 антиген гистосовместимости A-1 альфа-цепь OS = гомо сапиенс GN = HLA-A PE = 1 SV = 1 MAVMAPRTLLLLLSGALALTQTWAGSHSMRYFFTSVSRPGRGEPRFIAVGYVDDTQFVRF DSDAASQKMEPRAPWIEQEGPEYWDQETRNMKAHSQTDRANLGTLRGYYNQSEDGSHTIQ IMYGCDVGPDGRFLRGYRQDAYDGKDYIALNEDLRSWTAADMAAQITKRKWEAVHAAEQR RVYLEGRCVDGLRRYLENGKETLQRTDPPKTHMTHHPISDHEATLRCWALGFYPAEITLT WQRDGEDQTQDTELVETRPAGDGTFQKWAAVVVPSGEEQRYTCHVQHEGLPKPLTLRWEL SSQPTIPIVGIIAGLVLLGAVITGAVVAAVMWRRKSSDRKGGSYTQAASSDSAQGSDVSL TACKV

непосредственно перед зр существует ">", который я планировал использовать в качестве точки разделения записей. Итак, как я могу в итоге:

[[>sp|P30375|1A01_GORGO Class I histocompatibility antigen Gogo-A*0101 alpha chain OS=Gorilla gorilla gorilla PE=2 SV=1 
MAVMAPRTLVLLLSGALALTQTWAGSHSMRYFSTSVSRPGRGEPRFIAVGYVDDTQFVRF 
DSDAASQRMEPRAPWIEQEGPEYWDRNTRNVKAHSQTDRVDLGTLRGYYNQSEDGSHTIQ 
RMYGCDVGSDGRFLRGYQQDAYDGKDYIALNEDLRSWTAADMAAEITKRKWEAAHFAEQL 
RAYLEGTCVEWLRRHLENGKETLQRTDAPKTHMTHHAVSDHEAILRCWALSFYPAEITLT 
WQRDGEDQTQDTELVETRPAGDGTFQKWAAVVVPSGQEQRYTCHVQHEGLPEPLTLRWEP 
SSQPTIPIVGIIAGLVLFGAVIAGAVVAAVRWRRKSSDRKGGSYSQAASSDSAQGSDVSL 
TACKV] 
[>sp|P30443|1A01_HUMAN HLA class I histocompatibility antigen A-1 alpha chain OS=Homo sapiens GN=HLA-A PE=1 SV=1 
MAVMAPRTLLLLLSGALALTQTWAGSHSMRYFFTSVSRPGRGEPRFIAVGYVDDTQFVRF 
DSDAASQKMEPRAPWIEQEGPEYWDQETRNMKAHSQTDRANLGTLRGYYNQSEDGSHTIQ 
IMYGCDVGPDGRFLRGYRQDAYDGKDYIALNEDLRSWTAADMAAQITKRKWEAVHAAEQR 
RVYLEGRCVDGLRRYLENGKETLQRTDPPKTHMTHHPISDHEATLRCWALGFYPAEITLT 
WQRDGEDQTQDTELVETRPAGDGTFQKWAAVVVPSGEEQRYTCHVQHEGLPKPLTLRWEL 
SSQPTIPIVGIIAGLVLLGAVITGAVVAAVMWRRKSSDRKGGSYTQAASSDSAQGSDVSL 
TACKV]] 

using parsec? Это код, с которого я начал работать; how to parse a uniprot-file with parsec?

ответ

3

Насколько я понимаю вашу проблему, вам нужно только проанализировать записи, разделенные символом '>'. Тогда вы записи строка, содержащая все символы, но «>», и вы ищете что-то вроде этого:

import Control.Applicative ((*>)) 
import Text.Parsec 
import Text.Parsec.ByteString (Parser,parseFromFile) 

type Record = String 

parserFile :: FilePath -> IO [Record] 
parserFile fileName = do 
    r <- parseFromFile parseRecords fileName 
    case r of 
     Left msg -> error . show $ msg 
     Right xs -> return xs 


parseRecords :: Parser [Record] 
parseRecords = many1 $ (char '>') *> (many1 $ noneOf ['>']) 

Функция «parseFromFile» читать данные с помощью эффективного двоичного представления и принимает в качестве еще одного аргумента синтаксического анализатора для проанализируйте поток байтов, полученный в результате чтения файла.

Теперь все записи начинаются с символа '>', поэтому вам нужен только синтаксический анализатор, который соответствует символу «>» в ​​начале и сохраняет остальные символы в списке до следующего символа «>» ,

+0

и как я могу распечатать свои записи? Я думал, что: пусть records = parserFile «uniprot_sprot.fasta», пусть fstrecord = head records, даст мне список записей ([Запись]), и теперь fstrecord станет первой записью этого списка. – stian

+0

ParserFile - это монадическое вычисление (IO [Records]), поэтому, если вы хотите работать с содержимым ваших записей, вы должны сделать это внутри монадического контекста, например, в случае case, например: «Right xs -> print $ head xs ". Но теперь тип IO(), и вы должны изменить левый оператор: Left msg -> print msg – felipez

+0

еще раз спасибо. – stian

Смежные вопросы