免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 5525 | 回复: 17
打印 上一主题 下一主题

生成文件解决方案 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-06-12 16:35 |只看该作者 |倒序浏览
项目中有不少需求都是这样的:
1.接收到一个请求;
2.解析请求;
3.根据请求在数据库中导出一系列的数据,并写入文件;
4.将生成的文件发给请求方

目前的实现方式:
使用 sprinf( sValue, "%s|%s|%s|%s|%s|%s|%s|%s|%s|%s|%s|%s|%s|%s|%s|%s|%s\r\n",a1,a2,a3,a4 ...); 把数据库中导出的数据按照规范组合,然后写入文件。

想法:
感觉那样使用sprintf比较挫。因为导出的字段很可能需要变更,然后就需要你去数哪个%s后面需要增加%d,哪个变量后面需要增加一个变量。
我想问一下,有没有比较好的实现方案? 谢谢

论坛徽章:
1
15-16赛季CBA联赛之四川
日期:2016-02-15 17:12:32
2 [报告]
发表于 2012-06-12 17:14 |只看该作者
system调用生成文件的脚本

论坛徽章:
0
3 [报告]
发表于 2012-06-12 19:31 |只看该作者
采用配置文件,根据配置文件生成数据文件,可以避免很多代码修改。特别是生成格式打印文件时特别有用。

论坛徽章:
3
寅虎
日期:2013-11-27 07:53:29申猴
日期:2014-09-12 09:24:152015年迎新春徽章
日期:2015-03-04 09:48:31
4 [报告]
发表于 2012-06-12 20:00 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
5 [报告]
发表于 2012-06-12 21:13 |只看该作者

c++的sstream,
sstream << var1 << "|" << var2 ... << varn。


------------------------------------
欢迎光临我的博客:www.danoking.com [DNK的博客]

论坛徽章:
3
巳蛇
日期:2013-10-03 10:41:48申猴
日期:2014-07-29 16:12:04天蝎座
日期:2014-08-21 09:24:52
6 [报告]
发表于 2012-06-12 22:51 |只看该作者
顶3楼,感觉配置文件比较好

论坛徽章:
15
射手座
日期:2014-11-29 19:22:4915-16赛季CBA联赛之青岛
日期:2017-11-17 13:20:09黑曼巴
日期:2017-07-13 19:13:4715-16赛季CBA联赛之四川
日期:2017-02-07 21:08:572015年亚冠纪念徽章
日期:2015-11-06 12:31:58每日论坛发贴之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-07-12 22:20:002015亚冠之浦和红钻
日期:2015-07-08 10:10:132015亚冠之大阪钢巴
日期:2015-06-29 11:21:122015亚冠之广州恒大
日期:2015-05-22 21:55:412015年亚洲杯之伊朗
日期:2015-04-10 16:28:25
7 [报告]
发表于 2012-06-13 14:39 |只看该作者
本帖最后由 yulihua49 于 2012-06-13 15:33 编辑
qfmeal 发表于 2012-06-12 16:35
项目中有不少需求都是这样的:
1.接收到一个请求;
2.解析请求;

使用SRM,Struct Relational Mapping,结构-关系(数据库)映像,把数据库表记录映像到结构体。
然后把结构体序列化。
这个程序就是读数据库,任意的表,把所有数据生成你说的那个构造,写到文件。送到网络也是一样的,由客户端送来表名,返回结果集。
  1. int unloadfile(T_SQL_Connect *SQL_Connect,char *tablename,FILE *ofd,
  2.                 char *where,int buflen)
  3. {
  4. char *p;
  5. DAU _DAU;
  6. int num,ret,cur;
  7. INT64 now;

  8.         ShowLog(5,"unloadfile:entry dlmt=0X%02X",dlmt&255);
  9.         ret=DAU_init(&_DAU,SQL_Connect,tablename,0,0);//对于给定的表名,生成映像模板和相应的数据结构
  10.         if(ret) {
  11.                 ShowLog(1,"unloadfile:DAU_init tabname=%s,ret=%d",tablename,ret);
  12.                 return -1;
  13.         }
  14.         now=now_usec();
  15.         ret=DAU_prepare(&_DAU,where);//生成语句,where的部分由外部提供
  16.         ShowLog(5,"unldfile:ret=%d,stmt=%s",ret,where);
  17.         if(ret) {
  18.                 ShowLog(1,"unloadfile:err=%d,%s",ret,where);
  19.                 return ret;
  20.         }
  21.         while(!DAU_next(&_DAU))) { FETCH到DAU内部的结构
  22. //下边的这句话完成你所需的功能:
  23.                 DAU_pack(&_DAU,where);//DAU内部的结构 序列化到buffer where
  24. //形成  ....|......|....|...|的格式
  25.                 fprintf(ofd,"%s\n",where);//把where里的字符串送到网络也可以
  26.                 num+=ret;
  27.         }
  28.         DAU_free(&_DAU);
  29.         ShowLog(2,"unload %s:rows=%d,INTERVAL=%d",tablename,num,(int)(now_usec() - now));
  30.         return 0;
  31. }
复制代码
有兴趣者参加 QQ群:SDBC,在群共享有源码和说明书。

论坛徽章:
15
射手座
日期:2014-11-29 19:22:4915-16赛季CBA联赛之青岛
日期:2017-11-17 13:20:09黑曼巴
日期:2017-07-13 19:13:4715-16赛季CBA联赛之四川
日期:2017-02-07 21:08:572015年亚冠纪念徽章
日期:2015-11-06 12:31:58每日论坛发贴之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-07-12 22:20:002015亚冠之浦和红钻
日期:2015-07-08 10:10:132015亚冠之大阪钢巴
日期:2015-06-29 11:21:122015亚冠之广州恒大
日期:2015-05-22 21:55:412015年亚洲杯之伊朗
日期:2015-04-10 16:28:25
8 [报告]
发表于 2012-06-13 15:05 |只看该作者
本帖最后由 yulihua49 于 2012-06-13 15:30 编辑
blackuhlan 发表于 2012-06-12 19:31
采用配置文件,根据配置文件生成数据文件,可以避免很多代码修改。特别是生成格式打印文件时特别有用。

用模板。或用元数据文件生成模板。
或用数据库表结构生成模板。

-bash-3.00$ mkpatt.sh
输入表名: cm_station

T_PkgType CM_STATION_tpl[]={
        {CH_SHORT,sizeof(short),"station_code",0,-1},
        {CH_CHAR,51,"station_name"},
        {CH_CHAR,51,"en_name"},
        {CH_SHORT,sizeof(short),"line_no"},
        {CH_SHORT,sizeof(short),"sequence"},
        {CH_INT,sizeof(int),"ergcode"},
        {CH_SHORT,sizeof(short),"acccode"},
        {CH_INT,sizeof(int),"updistance"},
        {CH_INT,sizeof(int),"downdistance"},
        {CH_INT,sizeof(int),"downruntime"},
        {CH_INT,sizeof(int),"downstoptime"},
        {CH_INT,sizeof(int),"upruntime"},
        {CH_INT,sizeof(int),"upstoptime"},
        {CH_TINY,1,"station_type"},
        {CH_TIME,sizeof(INT64),"beg_time",YEAR_TO_SEC},
        {CH_CHAR,16,"version_sn"},
        {-1,0,"CM_STATION","acccode|beg_time|"}
};

extern T_PkgType CM_STATION_tpl[];
typedef struct {
        short station_code;
        char station_name[51];
        char en_name[51];
        short line_no;
        short sequence;
        int ergcode;
        short acccode;
        int updistance;
        int downdistance;
        int downruntime;
        int downstoptime;
        int upruntime;
        int upstoptime;
        char station_type;
        INT64 beg_time;
        char version_sn[16];
} CM_STATION_stu;

是这个表:
drop table cm_station;
CREATE TABLE "CMS_ACC"."CM_STATION"
   ( "STATION_CODE" number(4),
    "STATION_NAME" VARCHAR2(50),
    "EN_NAME" VARCHAR2(50),
    "DESCRIPTION" VARCHAR2(39),
    "LINE_NO" number(3),
    "SEQUENCE" NUMBER(3,0),
    "ERGCODE" NUMBER(9,0),
    "ACCCODE" NUMBER(5,0),
    "UPDISTANCE" NUMBER(5,0),
    "DOWNDISTANCE" NUMBER(5,0),
    "DOWNRUNTIME" NUMBER(5,0),
    "DOWNSTOPTIME" NUMBER(5,0),
    "UPRUNTIME" NUMBER(5,0),
    "UPSTOPTIME" NUMBER(5,0),
    "STATION_TYPE" NUMBER(1),                   -- 0:无效站,1:普通站,2:换乘站
    "BEG_TIME" date,                            -- 记录生效时刻,YYYY-MM-DD HH24:MI:SS
    "VERSION_SN" VARCHAR2(15),                  -- 版本集号 YYYY-MM-DD_NUM
        primary key (ACCCODE,BEG_TIME)
   );

程序:
CM_STATION_stu sta;
char buf[1024];
//对sta赋值或从数据库读入
       net_pack(buf,sta,CM_STATION_tpl);//这就是楼主所要的功能了,可以发到网络或写到文件。

就是这东东:
65|和平里北街|Hepinglibeijie|5|11|150996265|541|1059|1151|104|30|93|30|1|2011-01-01 00:00:00||
38|雍和宫|Yonghegong|5|12|150996267|543|1151|866|85|50|98|50|2|2011-01-01 00:00:00||
67|北新桥|Beixinqiao|5|13|150996269|545|866|791|74|30|81|30|1|2011-01-01 00:00:00||

上面的模板可以自动生成如下语句:
SELECT station_code,station_name,en_name,line_no,sequence,ergcode,acccode,updistance,downdistance,downruntime,downstoptime,
upruntime,upstoptime,station_type,TO_CHAR(beg_time,'YYYY-MM-DD HH24:MI:SS') beg_time,version_sn
FROM CMS_ACC.CM_STATION order by acccode,beg_time desc
它的结果集可以映像到上述结构。

      

论坛徽章:
0
9 [报告]
发表于 2012-07-14 17:27 |只看该作者
本帖最后由 jssfy 于 2012-07-14 17:29 编辑

貌似很简便,不过不知道怎么用。
请问能告知一下这是什么技术吗?网上有相应的资料可以查阅吗?我是针对您发的最后那个代码帖。

yulihua49 发表于 2012-06-13 15:05
用模板。或用元数据文件生成模板。
或用数据库表结构生成模板。

论坛徽章:
15
射手座
日期:2014-11-29 19:22:4915-16赛季CBA联赛之青岛
日期:2017-11-17 13:20:09黑曼巴
日期:2017-07-13 19:13:4715-16赛季CBA联赛之四川
日期:2017-02-07 21:08:572015年亚冠纪念徽章
日期:2015-11-06 12:31:58每日论坛发贴之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-07-12 22:20:002015亚冠之浦和红钻
日期:2015-07-08 10:10:132015亚冠之大阪钢巴
日期:2015-06-29 11:21:122015亚冠之广州恒大
日期:2015-05-22 21:55:412015年亚洲杯之伊朗
日期:2015-04-10 16:28:25
10 [报告]
发表于 2012-07-16 07:55 |只看该作者
本帖最后由 yulihua49 于 2012-07-16 08:02 编辑
jssfy 发表于 2012-07-14 17:27
貌似很简便,不过不知道怎么用。
请问能告知一下这是什么技术吗?网上有相应的资料可以查阅吗?我是针对您 ...

的确貌似简便,实为极其复杂,类似JAVA的ORM,(Object Reletional Mapping)我们称之为SRM(Struct Reletional Mapping)的技术。

其初级的技术实现:
http://space.itpub.net/8804348/viewspace-478471#xspace-itemreply
高级实现:
http://www.itpub.net/thread-1088197-1-1.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP