| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 512 人关注过本帖
标题:如何利用c++从文档内,抽取特定行列
取消只看楼主 加入收藏
cpp_初学者
Rank: 1
等 级:新手上路
帖 子:32
专家分:0
注 册:2011-6-30
结帖率:66.67%
收藏
已结贴  问题点数:20 回复次数:3 
如何利用c++从文档内,抽取特定行列
文档内容:
程序代码:
@HWI-BRUNOP16X_0001:4:1:1386:1030#0/1
GACCAATAAGTGATGATTGAATCGCGAGTGCTCGGCAGATTGCGATAAAC
+HWI-BRUNOP16X_0001:4:1:1386:1030#0/1
TNTTJTTTETceJSP__VRJea`_NfcefbWe[eagggggfgdggBBBBB
@HWI-BRUNOP16X_0001:4:1:1836:1032#0/1
CAGCAGACGCTTTGATTGCTCGATCTCTTGGTAAATACGGCATCATCTGC
+HWI-BRUNOP16X_0001:4:1:1836:1032#0/1
TJTTTJFFFFa`TWNMPJGTbZSTPZJHHGT^I^H^SKZeeeeeeb``RT

我利用一下的code,来读取及处理14Gb的文档:
程序代码:
[home@cpp]time grep -A1 '@HWI' input_file.txt | sed -e 's/--//g' -e 's/@HWI/>HWI/g' | sed '/^$/d' > output_file.txt
real    7m13.413s
user    5m25.382s
sys     1m37.668s
[1]+  Done       time grep -A1 '@HWI' input_file.txt | sed -e 's/--//g' -e 's/@HWI/>HWI/g' | sed '/^$/d' > output_file.txt           
[home@cpp]cat output_file.txt
>HWI-BRUNOP16X_0001:4:1:1386:1030#0/1
GACCAATAAGTGATGATTGAATCGCGAGTGCTCGGCAGATTGCGATAAAC
>HWI-BRUNOP16X_0001:4:1:1836:1032#0/1
CAGCAGACGCTTTGATTGCTCGATCTCTTGGTAAATACGGCATCATCTGC

在文体框,理想的格式输入法:
程序代码:
c++程序名称 要被读取的文档名称 结果输出新的文档名称
例如:
cplusplus_program input_file.txt output_file.txt

c++分析要被读取的文档逻辑:
1.当c++程序,发现要被读取文档的开头是"@HWI"时,取出该行及其下一行的内容,并将结果储存于新的文档内;
2.将所有开头是"@HWI",改成">HWI";
3.结果文档的理想内容是:
>HWI-BRUNOP16X_0001:4:1:1386:1030#0/1
GACCAATAAGTGATGATTGAATCGCGAGTGCTCGGCAGATTGCGATAAAC

谢谢各位c++高手的意见...
搜索更多相关主题的帖子: 如何 
2011-07-05 10:04
cpp_初学者
Rank: 1
等 级:新手上路
帖 子:32
专家分:0
注 册:2011-6-30
收藏
得分:0 
回复 3楼 pangding
以下是我利用您的sed command,处理14Gb数据,所花的时间:
程序代码:
real    6m16.302s
user    2m21.376s
sys     0m34.904s

[3]   Done                    time sed -ne '/@HWI/{s/@HWI/>HWI/p;n;p}' < input_file.txt > output_file.txt

这是另一个我试着用c++,分析相同数据,所花的时间:
程序代码:
real    1m6.012s
user    0m31.242s
sys     0m27.554s

[3]-  Done                    time ./cpp_program < input_file.txt > output_file.txt

以下是我所使用c++程序的code:
程序代码:
#include <stdio.h>
#include <string.h>

int main(void)
{
        char buf[4096];

       while(fgets(buf, 4096, stdin))
       {
               if(strncmp(buf, "@HWI", 4) == 0)
               {
                       buf[0]='>';
                       fputs(buf, stdout);
                       if(fgets(buf, 4096, stdin) == NULL) continue;
                       fputs(buf, stdout);
               }
}
}


2011-07-06 08:43
cpp_初学者
Rank: 1
等 级:新手上路
帖 子:32
专家分:0
注 册:2011-6-30
收藏
得分:0 
回复 4楼 pangding
awk,sed,perl我有基本了解的基础.
相同的文档,我打算试着改用c++来分析,最主要的目的,也是希望可以加快,分析及处理输入文档的时间 :)
c++需要从错误和讨论中学习.
若是你有任何可以加快及改进我以上的c++程序,我很乐意接受你的意见.
谢谢你的任何宝贵意见

2011-07-06 08:48
cpp_初学者
Rank: 1
等 级:新手上路
帖 子:32
专家分:0
注 册:2011-6-30
收藏
得分:0 
回复 7楼 pangding
版主,谢谢你的指导。
不好意思噢,最近网络不好,迟复你的。
你分享的意见,我再消化及理解着。
我主要想尝试利用c程序来处理文档,主要是,当我的输入文档,大过1Gb时,因为能使用的RAM有限,我时常需要消耗很多时间,才能得到理想的输出文档 :(
你是否有任何书能介绍?
关于如何利用c++及统计方面的资料?
我现在看着c++ primer plus。
觉得还不错下。
还在慢慢学习中.
2011-07-11 16:35
快速回复:如何利用c++从文档内,抽取特定行列
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.016818 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved