2015-04-01 50 views
0

我有一個問題之前,我從中學到了一個問題。我發現實現導致了一個字符串列表,而不是一個記錄列表。我正在解析的文件具有如下的記錄;如何解析記錄?

SP | P30375 | 1A01_GORGO I類組織相容性抗原的Gogo-A * 0101的α鏈OS =大猩猩大猩猩PE = 2 SV = 1 MAVMAPRTLVLLLSGALALTQTWAGSHSMRYFSTSVSRPGRGEPRFIAVGYVDDTQFVRF DSDAASQRMEPRAPWIEQEGPEYWDRNTRNVKAHSQTDRVDLGTLRGYYNQSEDGSHTIQ RMYGCDVGSDGRFLRGYQQDAYDGKDYIALNEDLRSWTAADMAAEITKRKWEAAHFAEQL RAYLEGTCVEWLRRHLENGKETLQRTDAPKTHMTHHAVSDHEAILRCWALSFYPAEITLT WQRDGEDQTQDTELVETRPAGDGTFQKWAAVVVPSGQEQRYTCHVQHEGLPEPLTLRWEP SSQPTIPIVGIIAGLVLFGAVIAGAVVAAVRWRRKSSDRKGGSYSQAASSDSAQGSDVSL TACKV SP | P30443 | 1A01_HUMAN HLA I類組織相容性抗原A-1α鏈OS =智人GN = HLA-A PE = 1 SV = 1 MAVMAPRTLLLLLSGALALTQTWAGSHSMRYFFTSVSRPGRGEPRFIAVGYVDDTQFVRF DSDAASQKMEPRAPWIEQEGPEYWDQETRNMKAHSQTDRANLGTLRGYYNQSEDGSHTIQ IMYGCDVGPDGRFLRGYRQDAYDGKDYIALNEDLRSWTAADMAAQITKRKWEAVHAAEQR RVYLEGRCVDGLRRYLENGKETLQRTDPPKTHMTHHPISDHEATLRCWALGFYPAEITLT WQRDGEDQTQDTELVETRPAGDGTFQKWAAVVVPSGEEQRYTCHVQHEGLPKPLTLRWEL SSQPTIPIVGIIAGLVLLGAVITGAVVAAVMWRRKSSDRKGGSYTQAASSDSAQGSDVSL TACKV

只是有sp的一個 「>」,我打算前用作記錄分界點。那麼,我該如何結束:

[[>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

以及如何打印我的記錄?我認爲:let records = parserFile「uniprot_sprot.fasta」,讓fstrecord = head記錄,會給我一個記錄列表([Record]),並且fstrecord現在將成爲該列表的第一條記錄。 – stian 2015-04-01 10:08:59

+0

ParserFile是一個monadic計算(IO [Records]),因此如果你想用你的記錄內容進行操作,你應該在monadic上下文中進行操作,例如在case語句中,比如:「Right xs - > print $ head xs「。但現在類型是IO(),並且您還必須將Left語句更改爲:Left msg - > print msg – felipez 2015-04-01 14:45:38

+0

再次感謝您。 – stian 2015-04-01 19:02:27