📄 dataprocessor.cpp
字号:
/************************************************************************/
/* 主程序
/* @author 纪磊
/* @email jil08@qq.com
/* @date 2009-02-14
我的原理是
1. 读入filter.txt
2. 从filter.txt取出一个商品号A
3. 一行一行读取detail.txt,看其商品号是否为A,是的话将其小单号存到一个表B中
4. 重新一行一行读detail.txt,看其小单号是否在B中,是的话输出。第一步结束。
纪磊 说(23:05):
5. 在第一步的结果中,一行一行地读,将一个小单号中某个商品号的总数加起来。
6. 在B中去掉那些其中A商品的数量和为零的小单号,得到B'
7. 在B'中,一行一行读,如果某个商品号数量不为零,加入到表C中,这是您后来提出消除全F的列需要的。
8. 以B'中小单号为每一行,以C中的商品号为每一列,输出统计数值及布尔值到两个文件。
9回到2,处理下一个商品号
/************************************************************************/
//#include <crtdbg.h>
//#define _CRTDBG_MAP_ALLOC
#include "dataProcessor.h"
int main()
{
// 1.读入filter.txt, 生成商品号向量
ifstream filterFile(filterFileName.c_str());
if (!filterFile) {
cerr<< "错误: 商品过滤文件filter.txt不存在,请检查后重试!\n";
system("pause");
return -1;
}
istream_iterator<string> begin1(filterFile);
istream_iterator<string> eos1;
list<string> filterIDs(begin1, eos1);
cout<<"读入filter.txt...\n";
// 2.读入detail.txt...
ifstream detailFile(detailFileName.c_str());
if (!detailFile) {
cerr<< "错误: 商品销售小单文件detail.txt不存在,请检查后重试!\n";
system("pause");
return -1;
}
//list<string> records;
// string textline;
// while(getline(detailFile,textline,'\n')){
// records.push_back(textline);
// }
cout<<"读入detail.txt, 生成销售小单向量\n";
// 3.取一个商品号进行过滤, 输出过滤结果, 中间建立set来存含商品ID的小单号
int existIDCount = 0;
list<string>::iterator iter = filterIDs.begin();
for (; iter!= filterIDs.end(); iter++)
{
if (*iter=="")
{
continue;
}
cout<<"处理商品号"<<*iter<<"...\n";
set<string> ticketIDs;
list<string> filterVec;
list<string>::iterator iter_rec;
string textline;
detailFile.clear();
detailFile.seekg(0);
while(getline(detailFile,textline,'\n')){
istringstream textlinebuf(textline);
istream_iterator<string> begin2(textlinebuf);
istream_iterator<string> eos2;
vector<string> record(begin2,eos2);
if (record.size()>6 && record[5]==*iter)
{
ticketIDs.insert(record[0]);
}
}
if (!ticketIDs.empty())
{
//cout<<"商品号"<<*iter<<"过滤完毕, 生成过滤结果...\n";
detailFile.clear();
detailFile.seekg(0);
while(getline(detailFile,textline,'\n')){
istringstream textlinebuf(textline);
istream_iterator<string> begin2(textlinebuf);
istream_iterator<string> eos2;
vector<string> record(begin2,eos2);
if (record.size()>6 && ticketIDs.count(record[0]))
{
filterVec.push_back(textline);
}
}
//cout<<"商品号"<<*iter<<"过滤结果已生成...\n";
}
// for (; iter_rec!=records.end(); iter_rec++)
// {
// istringstream textlinebuf(*iter_rec);
// istream_iterator<string> begin2(textlinebuf);
// istream_iterator<string> eos2;
// vector<string> record(begin2,eos2);
// if (record[5]==*iter)
// {
// ticketIDs.insert(record[0]);
// }
// }
// iter_rec = records.begin();
// for (; iter_rec!=records.end(); iter_rec++)
// {
// istringstream textlinebuf(*iter_rec);
// istream_iterator<string> begin2(textlinebuf);
// istream_iterator<string> eos2;
// vector<string> record(begin2,eos2);
// if (ticketIDs.count(record[0]))
// {
// filterVec.push_back(*iter_rec);
// }
// }
if (!filterVec.empty())
{
existIDCount++;
// ofstream filterResultFile(((string)*iter+".txt").c_str());
// if (!filterResultFile) {
// cerr<< "错误: 无法输出第一步过滤后的文件,请检查磁盘容量!\n";
// system("pause");
// return -1;
// }
// iter_rec = filterVec.begin();
// copy(filterVec.begin(), filterVec.end(),ostream_iterator<string>(filterResultFile,"\n"));
// filterResultFile<<endl;
// cout<<"输出商品号"<<*iter<<"的过滤结果到文件"<<*iter<<".txt...\n";
// 4.对过滤结果进行统计, 生成小票号, 商品号, 统计数字对应的set
typedef pair<string, string> sellPair;
map<sellPair,int> count;
iter_rec = filterVec.begin();
for (; iter_rec != filterVec.end(); iter_rec++)
{
istringstream textlinebuf(*iter_rec);
istream_iterator<string> begin(textlinebuf);
istream_iterator<string> eos;
vector<string> record(begin,eos);
sellPair newPair(record[0],record[5]);
if (count.count(newPair)) {
count[newPair]+=atoi(((string)record[1]).c_str());
} else{
count.insert(map<sellPair,int>::value_type(newPair,atoi(((string)record[1]).c_str())));
}
}
//清理零和小单号
map<sellPair,int>::iterator iter_map = count.begin();
for (; iter_map!=count.end();iter_map++)
{
if (((sellPair)(*iter_map).first).second==*iter && (*iter_map).second==0)
{
ticketIDs.erase(((sellPair)(*iter_map).first).first);
}
}
//清理零和商品号
set<string> goodsIDs;
iter_map = count.begin();
for (; iter_map!=count.end();iter_map++)
{
if (ticketIDs.count(((sellPair)(*iter_map).first).first) && (*iter_map).second!=0)
{
goodsIDs.insert(((sellPair)(*iter_map).first).second);
}
}
//cout<<"输出商品号"<<*iter<<"与销售单的数量关联矩阵到文件"<<*iter<<"num.txt...\n";
cout<<"输出商品号"<<*iter<<"与销售单的布尔关联矩阵到文件"<<*iter<<"bool.txt...\n";
// ofstream numResultFile(((string)*iter+"num.txt").c_str());
// if (!numResultFile) {
// cerr<< "错误: 无法输出第一步过滤后的文件,请检查磁盘容量!\n";
// system("pause");
// return -1;
// }
ofstream boolResultFile(((string)*iter+"bool.txt").c_str());
if (!boolResultFile) {
cerr<< "错误: 无法输出第一步过滤后的文件,请检查磁盘容量!\n";
system("pause");
return -1;
}
//numResultFile<<"小票号"<<'\t';
boolResultFile<<"小票号"<<'\t';
set<string>::iterator iter_set = goodsIDs.begin();
for (; iter_set!=goodsIDs.end();iter_set++)
{
//numResultFile<<*iter_set<<'\t';
boolResultFile<<*iter_set<<'\t';
}
//numResultFile<<'\n';
boolResultFile<<'\n';
set<string>::iterator iter_ticket = ticketIDs.begin();
bool firstLine = true;
for (; iter_ticket!=ticketIDs.end();iter_ticket++)
{
//numResultFile<<*iter_ticket<<'\t';
boolResultFile<<*iter_ticket<<'\t';
iter_set = goodsIDs.begin();
for (; iter_set!=goodsIDs.end();iter_set++)
{
if (firstLine && *iter_set == *iter) {
firstLine = false;
//numResultFile<<"0.00"<<'\t';
boolResultFile<<"F"<<'\t';
}else{
sellPair newPair(*iter_ticket, *iter_set);
if (count.count(newPair)) {
//stringstream countstring;
//countstring<<count[newPair];
//numResultFile<<count[newPair]<<".00"<<'\t';
boolResultFile<<"T"<<'\t';
} else{
//numResultFile<<"0.00"<<'\t';
boolResultFile<<"F"<<'\t';
}
}
}
//numResultFile<<'\n';
boolResultFile<<'\n';
}
}
filterVec.clear();
ticketIDs.clear();
}
//records.clear();
//_CrtDumpMemoryLeaks();
cout<<"...\n共处理"<<filterIDs.size()<<"个商品号, 其中"<<existIDCount<<"个为有效商品号, 已为其生成文件,运行成功!\n";
filterIDs.clear();
system("pause");
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -