| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 773 人关注过本帖
标题:如何在c程序里,读取两个文档疑问
只看楼主 加入收藏
cpp_初学者
Rank: 1
等 级:新手上路
帖 子:32
专家分:0
注 册:2011-6-30
结帖率:66.67%
收藏
已结贴  问题点数:20 回复次数:17 
如何在c程序里,读取两个文档疑问
文档1:
程序代码:
124
235
152
178
156
142
178
163
159

文档2:
程序代码:
124|5623
452|6698
178|9995
235|7542
159|8852
152|9963
156|8512
885|9956
754|6523

理想输出文档结果:
程序代码:
124|5623
235|7542
152|9963
178|9995
156|8512
142|
178|9995
163|
159|8852

分析数据逻辑:
程序代码:
1. 理想输出文档结果,以文档1的内容为模板;若文档2有相同数据,印出其数据;若不,保留空白;
2.理想格式:
程序名称 文档1名称 文档2名称 理想输出文档结果

我写的awk code:
awk -F"|" ' NR == FNR { arr[$1]=$2; next } {  print $1"|"arr[$1] } '  文档2名称 文档1名称 > 理想输出文档结果

我的awk,若是当文档1和2,数据相近时,没有分析上的问题。
但若文档1和2过大,这会遇到无法读取文档的问题 :(
多谢各位的意见.
搜索更多相关主题的帖子: c程序 如何 color 
2011-07-11 17:00
pangding
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:北京
等 级:贵宾
威 望:94
帖 子:6784
专家分:16751
注 册:2008-12-20
收藏
得分:7 
文档不会又是几个 G 吧?
2011-07-11 21:05
pangding
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:北京
等 级:贵宾
威 望:94
帖 子:6784
专家分:16751
注 册:2008-12-20
收藏
得分:0 
是不是一定是文档一的数据比二的多?会不会有一行文档二里有,而一里没有的?
2011-07-11 21:11
cpp_初学者
Rank: 1
等 级:新手上路
帖 子:32
专家分:0
注 册:2011-6-30
收藏
得分:0 
回复 2楼 pangding
你好,版主 :)
我要读取的文档,没有那么大..
两个文档,各别最多大约(~400Mb)罢了
2011-07-12 11:01
cpp_初学者
Rank: 1
等 级:新手上路
帖 子:32
专家分:0
注 册:2011-6-30
收藏
得分:0 
回复 3楼 pangding
文档1的数据,有可能比文档2少...
但理想输出结果,一切介试文档1为模板...
数据里,是有可能文档2里有,而文档1没有的情况发生...
2011-07-12 11:03
succubus
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:4
帖 子:635
专家分:1080
注 册:2007-10-7
收藏
得分:7 
程序代码:
#include <map>
#include <string>
#include <fstream>

using namespace std;

int main()
{
    map<string, string> outMap;
    ifstream fin1("doc1.txt");
    ifstream fin2("doc2.txt");
    ofstream fout("out.txt");
    string key;
    string word;
    string line;
    int delimiterPos;
    map<string, string>::iterator searchRes;

    while (fin1 >> key)
    {
        outMap.insert(make_pair(key, "|"));
    }

    while (fin2 >> line)
    {
        delimiterPos = line.find('|');
        key = line.substr(0, delimiterPos);
        word = line.substr(delimiterPos);
        if ((searchRes = outMap.find(key)) != outMap.end())
            searchRes->second = word;
    }

    for (map<string, string>::iterator iter = outMap.begin(); iter != outMap.end(); ++iter)
    {
        fout << iter->first << iter->second << endl;
    }

    return 0;
}
不要求输出文档的输出顺序和文档1一样的话上面这代码就够了
否则还得再加几句代码。。。

[url=http:///view/aDU1]/image/aDU1.gif" border="0" />[/url]
2011-07-12 13:23
cpp_初学者
Rank: 1
等 级:新手上路
帖 子:32
专家分:0
注 册:2011-6-30
收藏
得分:0 
回复 6楼 succubus
谢谢你的回复,succubus :)
这是我用您的程序,得到的结果:
程序代码:
124|5623
142|
152|9963
156|8512
159|8852
163|
178|9995
235|7542

输入文档1中“178”出现了两次.
但以上的结果,只出现一次的“178”.
您有任何意见,可以让结果页面如文档1一样,出现两次的“178”?
谢谢 :)
2011-07-12 14:42
succubus
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:4
帖 子:635
专家分:1080
注 册:2007-10-7
收藏
得分:0 
以下是引用cpp_初学者在2011-7-12 14:42:04的发言:

谢谢你的回复,succubus :)
这是我用您的程序,得到的结果:
 
124|5623
142|
152|9963
156|8512
159|8852
163|
178|9995
235|7542
 
输入文档1中“178”出现了两次.
但以上的结果,只出现一次的“178”.
您有任何意见,可以让结果页面如文档1一样,出现两次的“178”?
谢谢 :)
程序代码:
#include <map>
#include <string>
#include <fstream>
#include <vector>

using namespace std;

int main()
{
    map<string, string> outMap;
    vector<string> keys;
    ifstream fin1("doc1.txt");
    ifstream fin2("doc2.txt");
    ofstream fout("out.txt");
    string key;
    string word;
    string line;
    int delimiterPos;
    map<string, string>::iterator searchRes;

    while (fin1 >> key)
    {
        keys.push_back(key);
        outMap.insert(make_pair(key, "|"));
    }

    while (fin2 >> line)
    {
        delimiterPos = line.find('|');
        key = line.substr(0, delimiterPos);
        word = line.substr(delimiterPos);
        if ((searchRes = outMap.find(key)) != outMap.end())
            searchRes->second = word;
    }

    for (vector<string>::iterator iter = keys.begin(); iter != keys.end(); ++iter)
    {
        searchRes = outMap.find(*iter);
        fout << searchRes->first << searchRes->second << endl;
    }

    return 0;
}
加个vector保存文档1的输入就行了
这样输出的顺序也可以和文档1的顺序保持一致,代码如上。
或者使用multimap代替map,multimap里的key可以出现多次,这个你可以自己试试。

[url=http:///view/aDU1]/image/aDU1.gif" border="0" />[/url]
2011-07-12 14:50
cpp_初学者
Rank: 1
等 级:新手上路
帖 子:32
专家分:0
注 册:2011-6-30
收藏
得分:0 
回复 8楼 succubus
谢谢您,succubus.
您所写的c++程序,得到和理想结果一样的数据 :)
要好好消化和理解您所写的程序。
处理较大的文档时,也是很快
非常感谢你的分享噢。
2011-07-12 16:06
succubus
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:4
帖 子:635
专家分:1080
注 册:2007-10-7
收藏
得分:0 
不用客气
通过你的发帖看出你不是伸手党
所以我也乐于花点儿时间把代码给写出来供你参考
你可以找一些stl的资料看看差不多就能理解我写的了
STL的map用的数据结构实际上是红黑树,所以还是比较快的

[url=http:///view/aDU1]/image/aDU1.gif" border="0" />[/url]
2011-07-12 16:21
快速回复:如何在c程序里,读取两个文档疑问
数据加载中...
 
   



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

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