蛋白质互作工具开发笔记(二)——文件和大量字符串的处理

文章详细对比了C++和C标准在处理文件和蛋白质信息识别上的优劣,通过实例展示了如何使用C语言解决复杂问题,并提供了蛋白质信息识别的正则表达式解决方案。

虽然说C++标准非常高效规整,但是C标准有时却是解决问题的最快方法。


最开始时尝试用fstream 来打开文件,虽然能顺利打开并获取数据,但是遇到换行的时候却非常容易出错。

代码如下:

fstream file1;
file1.open("ecoli.txt",fstream::in | fstream:: out);
while(!file1.eof())
{
      file1.getline(buf,100,'\n');
      cout<<buf<<endl;
}

这样得到的每一行数据可能会和上一行重复(或者是我没学好这种用法,总之比较容易出问题或者内存溢出)。


无奈之下用了C的代码:

#include <stdio.h>
#include <string.h>

#define MAX_LINE 1024

int main(void)
{
  char buf[MAX_LINE]; /* 缓冲区 */
  FILE *fp;
  int len;

  if((fp = fopen("test.txt", "r")) == NULL)
  { /* 打开文件 */
    perror("fail to read");
    exit(1);
  }

while(fgets(buf, MAX_LINE, fp) != NULL)
 { /* 每次读入一行 */
    len = strlen(buf);
    /* 输出所读到的字符画串,并将字符个数输出 */
    buf[len - 1] = '\0'; /* 去掉换行符,这样其他的字符串函数就可以处理了 */
    printf("%s %d\n", buf, len - 1); /* 使用printf函数输出 */
  }
  return 0;
}

这样才能顺利获得每一行的数据并保证没有错误。


另一个问题是蛋白质信息字符串的识别。最开始我想到的是快速匹配算法,但是这样效率并不高而且考虑到DIP-XXXXN这样的格式中XXXX的长度不定而且是变化的,所以打算用正则表达式类,也就是VS2008之后的版本带的 regex.h

文件Ecoli20111027.txt中的内容如下:

DIP-367N|refseq:NP_288037|uniprotkb:P07002 DIP-366N|refseq:NP_416120|uniprotkb:P07001
DIP-342N|refseq:NP_414931|uniprotkb:P13458 DIP-572N|refseq:NP_040618|uniprotkb:P03702
DIP-572N|refseq:NP_040618|uniprotkb:P03702 DIP-540N|refseq:NP_417297|uniprotkb:P08394
DIP-540N|refseq:NP_417297|uniprotkb:P08394 DIP-583N|refseq:NP_059594|uniprotkb:P11191
DIP-341N|refseq:NP_286213|uniprotkb:P12727 DIP-340N|refseq:NP_289122|uniprotkb:P15027
DIP-340N|refseq:NP_289122|uniprotkb:P15027 DIP-364N|refseq:NP_313068|uniprotkb:P02339

我们要得到的是一组DIP-数字N这样的字符串对,所以

识别公式为:

(DIP-[0-9]*N)(.*)(\t)(DIP-[0-9]*N)

如果结果存放在数组 res[] 中,则第一个 DIP-[0-9]*N 存放在res[1] ,第二个 DIP-[0-9]*N 存放在 res[4],程序可以直接调用。


可以得到获取DIP互作信息对的代码:

//获取DIP-XXXX互作用对
#include <stdio.h>
#include <iostream>
#include <regex>
#include <string>

#define MAX_LINE 1024

void main(void)
{
	char buf[MAX_LINE]; /* 缓冲区 */
    std::string str;                             //待匹配串
    std::tr1::cmatch res;                        //捕获集合
	FILE *fp;
	int len;

	if((fopen_s(&fp, "Ecoli20111027.txt", "r")) == NULL)
	{ /* 打开文件 */
		perror("fail to read");
	}

	while(fgets(buf, MAX_LINE, fp) != NULL)
	{ /* 每次读入一行 */
		len = strlen(buf);
		str = buf;
		std::tr1::regex rx("(DIP-[0-9]*N)(.*)(\t)(DIP-[0-9]*N)");
		std::tr1::regex_search(str.c_str(), res, rx);
		std::cout<<res[1]<<'.'<<res[4]<<std::endl;
	}

}




输出结果如下图·:


修改于2012-03-02:增加Ecoli文件详情



===================================

本文来自:http://blog.youkuaiyun.com/zh405123507

tags:蛋白质 fasta 正则式 正则表达式


评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值