⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dataprocessor.cpp

📁 a tool to process supermarket data of selling.
💻 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 + -