C/C++12天气APP:不同数据建表入表,数据交换(exptables.cpp,ftpputfiles.cpp)

Posted 码农编程录

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C/C++12天气APP:不同数据建表入表,数据交换(exptables.cpp,ftpputfiles.cpp)相关的知识,希望对你有一定的参考价值。


1.分区预警信号数据:strstr,UpdateStr

1.1 数据说明:.txt后缀可改为.csv后缀

下面是excel软件打开.txt文件(以逗号分隔)。

如下是xml标准格式,前后加< data >标签,每行后加< end1/>,只有标准格式才能用浏览器打开显示。


下面为说明文档:

1.2 建表入表:站点代码改为街道代码,站点名称改为街道名称


// psignallog.cpp封成类
#include "_public.h"
#include "_ooci.h"
#include "_shqx.h"
CLogFile logfile;
CDir Dir;
bool _psignallog();
connection conn;
void EXIT(int sig);
int main(int argc,char *argv[])

  if (argc!=5)
  
    printf("\\n本程序用于处理分区预警信号发布日志,并保存到数据库的T_SIGNALLOG表中。\\n");
    printf("/oracle/htidc/shqx/bin/psignallog 数据文件存放的目录 日志文件名 数据库连接参数 程序运行时间间隔\\n");
    printf("例如:/oracle/htidc/shqx/bin/psignallog /oracle/data/shqx/sdata/wpfiles /oracle/log/shqx/psignallog.log shqx/pwdidc@snorcl11g_128 10\\n");
    return -1;
  
  CloseIOAndSignal();
  signal(SIGINT,EXIT); signal(SIGTERM,EXIT);
  if (logfile.Open(argv[2],"a+")==false)
  
    printf("打开日志文件失败(%s)。\\n",argv[2]); return -1;
  
  logfile.Write("程序启动。\\n");

//1111111111111111111111111111111111111111111111111111111111  
  while (true)
  
    // logfile.Write("开始扫描目录。\\n");    
    if (Dir.OpenDir(argv[1],"WP20*.DTB",1000,true,true)==false)
     // 扫描数据文件存放的目录,只匹配"WP20*.DTB"
      logfile.Write("Dir.OpenDir(%s) failed.\\n",argv[1]); sleep(atoi(argv[4])); continue;
    
        
    while (true)  // 逐个处理目录中的数据文件
    
      if (Dir.ReadDir()==false) break;  
      if (conn.m_state==0)
      
        if (conn.connecttodb(argv[3],"Simplified Chinese_China.ZHS16GBK")!=0)
        
          logfile.Write("connect database(%s) failed.\\n%s\\n",argv[3],conn.m_cda.message); break;
        
        // logfile.Write("连接数据库成功。\\n");
        
      logfile.Write("开始处理文件%s...",Dir.m_FileName);        
      if (_psignallog()==false)  
      
        logfile.WriteEx("失败。\\n"); break;
      
    
    if (conn.m_state==1) conn.disconnect(); 
    sleep(atoi(argv[4]));
  
  return 0;

void EXIT(int sig)

  logfile.Write("程序退出,sig=%d\\n\\n",sig);
  exit(0);


//111111111111111111111111111111111111111111111111111111
bool _psignallog()

  CFile File;
  if (File.Open(Dir.m_FullFileName,"r")==false)
  
    logfile.Write("(File.Open(%s) failed.\\n",Dir.m_FullFileName); return false;
  
  CSIGNALLOG SIGNALLOG(&conn,&logfile);
  
  char strBuffer[301]; // 读取文件中的每一行记录,写入数据库的表中
  while (true)
  
    memset(strBuffer,0,sizeof(strBuffer));    
    if (File.Fgets(strBuffer,300,true)==false) break;  // 从文件中获取一行记录
    // 每行预警信号发布的记录的最后都是用"000="结束的。不会得到第一,二行和最后一行
    if (strstr(strBuffer,"000=")==0) continue;
    UpdateStr(strBuffer,"  "," ",true);  // 把内容中的两个空格替换成一个空格
    // logfile.Write("%s\\n",strBuffer);    
    // 把用逗号分隔的记录拆分到结构体中
    if (SIGNALLOG.SplitBuffer(strBuffer)==false)  logfile.Write("%s\\n",strBuffer); continue; 
    // 把vsignallog容器中的值更新到T_SIGNALDATA表中。
    long rc=SIGNALLOG.InsertTable();
    // 只要不是数据库session的错误,程序就继续。
    if ( (rc>=3113) && (rc<=3115) ) return false;
    if (rc != 0)  logfile.Write("%s\\n",strBuffer); continue; 
    
  conn.commit(); // 提交事务  
  File.CloseAndRemove(); // 关闭文件指针,并删除文件
  logfile.WriteEx("成功(total=%d,insert=%d,update=%d,invalid=%d)。\\n",SIGNALLOG.totalcount,SIGNALLOG.insertcount,SIGNALLOG.updatecount,SIGNALLOG.invalidcount);
  return true;

关于_shqx.h(增加了struct st_signallog结构体)和_shqx.cpp见文章:https://blog.csdn.net/weixin_43435675/article/details/103476761

WP…0510.DTB时间是05:10:00下面是加了8小时。

2.台风(热带气旋)数据:SplitBuffer,InsertTable

2.1 数据说明:头记录,实况路径

第一行第四个开始:开始依次气旋序号cyclone(001),国内编号num(1801),热带气旋终结标志ws(0),每行路径间隔小时数hours(6),热带气旋的英文名称t_name(BOLAVEN),数据集形成的日期datasettime(20190319)。

第二行第一个开始:YYYY年MM月DD日HH时ddatetime(世界时2018021000),强度标记h_level(1),纬度lat(84),经度lon(1435),中心最低气压pres(1008),2分钟平均近中心最大风速wnd(13),(2分钟平均风速owd)。

1.头记录(第一行)格式如下:

2.实况路径(第二行往下)(不是预报路径)数据记录格式如下:

2.2 建表入表:AddTime

// typthoon.cpp
#include "_public.h"
#include "_ooci.h"
#include "_shqx.h"
CLogFile logfile;
CDir Dir;
bool _typthon(); //处理数据文件
connection conn;
void EXIT(int sig);

int main(int argc,char *argv[])

  if (argc!=5)
  
    printf("\\n本程序用于处理分区预警信号发布日志,并保存到数据库的T_SIGNALLOG表中。\\n");
    printf("/oracle/htidc/shqx/bin/typthon 数据文件存放的目录 日志文件名 数据库连接参数 程序运行时间间隔\\n");
    printf("例如:/oracle/htidc/shqx/bin/typthon /oracle/data/shqx/sdata/typthon /oracle/log/shqx/typthon.log shqx/pwdidc@snorcl11g_128 10\\n");
    return -1;
  
  CloseIOAndSignal();
  signal(SIGINT,EXIT); signal(SIGTERM,EXIT);
  if (logfile.Open(argv[2],"a+")==false)
  
    printf("打开日志文件失败(%s)。\\n",argv[2]); return -1;
  
  logfile.Write("程序启动。\\n");

//11111111111111111111111111111111111111111111111111111111
  while (true)
  
     logfile.Write("开始扫描目录。\\n");
    // 扫描数据文件存放的目录,只匹配"CH20*.DTB"
    if (Dir.OpenDir(argv[1],"CH*.TXT",1000,true,true)==false)
    
      logfile.Write("Dir.OpenDir(%s) failed.\\n",argv[1]); sleep(atoi(argv[4])); continue;
    
    // 逐个处理目录中的数据文件
    while (true)
    
      if (Dir.ReadDir()==false) break;  
      if (conn.m_state==0)
      
        if (conn.connecttodb(argv[3],"Simplified Chinese_China.ZHS16GBK")!=0)
        
          logfile.Write("connect database(%s) failed.\\n%s\\n",argv[3],conn.m_cda.message); break;
        
         logfile.Write("连接数据库成功。\\n");
        
      logfile.Write("开始处理文件%s...",Dir.m_FileName);  
            
      if (_typthon()==false)  //处理数据文件
      
        logfile.WriteEx("失败。\\n"); break;
      
    
    if (conn.m_state==1) conn.disconnect(); 
    sleep(atoi(argv[4]));
  
  return 0;

void EXIT(int sig)

  logfile.Write("程序退出,sig=%d\\n\\n",sig);
  exit(0);

     
//111111111111111111111111111111111111111111111111111
bool _typthon()

  CFile File;
  if (File.Open(Dir.m_FullFileName,"r")==false)
  
    logfile.Write("(File.Open(%s) failed.\\n",Dir.m_FullFileName); return false;
  
  CTYPTHOON TYPTHON(&conn,&logfile);
  // 读取文件中的每一行记录
  // 写入数据库的表中
  char strBuffer[301];
  while (true)
  
    memset(strBuffer,0,sizeof(strBuffer));    
    if (File.Fgets(strBuffer,300,true)==false) break; //从文件中获取一行记录
    UpdateStr(strBuffer,"  "," ",true);  //把内容中的两个空格替换成一个空格
    // logfile.Write("%s\\n",strBuffer);    
    // 把用逗号分隔的记录拆分到结构体中
    if (TYPTHON.SplitBuffer(strBuffer)==false)  logfile.Write("%s拆分失败\\n",strBuffer); continue;     
    long rc=TYPTHON.InsertTable(); // 把vsignallog容器中的值更新到T_SIGNALDATA表中
    
    if ( (rc>=3113) && (rc<=3115) ) return false; // 只要不是数据库session的错误,程序就继续
    if (rc != 0)  logfile.Write("%s\\n",strBuffer); continue; 
  
  conn.commit();
  File.CloseAndRemove();
  logfile.WriteEx("成功(total=%d,insert=%d,update=%d,invalid=%d)。\\n",TYPTHON.totalcount,TYPTHON.insertcount,TYPTHON.updatecount,TYPTHON.invalidcount);
  return true;

//_shqx.h
#ifndef _SHQX_H
#define _SHQX_H
#include "_public.h"
#include "_ooci.h"

struct st_typthoon1  //实况路径
 
  char ddatetime[21];   // YYYY年, MM月, DD日,HH时(世界时);
  char h_level[2];      //强度标记
  double lat;          // 纬度
  double lon;          // 经度
  char pres[2];     //中心最低气压(hPa);
  int  wnd;     //2分钟平均近中心最大风速(MSW, m/s)
  int  owd;     //2分钟平均风速(m/s)
  int t_no;  //自定义台风编号,从第0个开始
; 
struct st_typthoon  //头记录

  char cyclone[5];       //气旋序号
  char num[5];        //国内编号
  char ws[2];            //热带气旋终结标志
  char hours[2];         //每行路径间隔小时数, 目前均为6(小时);
  char t_name[30];         //热带气旋的英文名称, 名称后加 “(-1)n” 表示副中心及其序号;
  char datasettime[21];  //数据集形成的日期
;

class CTYPTHOON

public:
  int totalcount,insertcount,updatecount,invalidcount;  // 记录总数据、插入数、更新数、无效记录数。
  int c;//个数
  struct st_typthon m_sttypthon;
  struct st_typthon1 m_sttypthon1;
  vector<struct st_typthon> vtypthon;   // 容器存放一个文件的全部记录
  CTYPTHON(connection *conn,CLogFile *logfile);
 ~CTYPTHON();
  void initdata();  // 数据初始化

  connection *m_conn;
  CLogFile   *m_logfile;
  int iccount;
  sqlstatement stmtsel,stmtins,stmtupt;
  // 把记录拆分到vsignallog容器中。
  bool SplitBuffer(const char *strBuffer);
  // 把vsignallog容器中的值更新到T_SIGNALDATA表中。
  long InsertTable();
;
#endif
//_shqx.cpp
#include "_shqx.h"

CTYPTHON::CTYPTHON(connection *conn,CLogFile *logfile)

  initdata();
  m_conn=conn; m_logfile=logfile;

void CTYPTHON::initdata()

  totalcount=insertcount=updatecount=invalidcount=0;
  m_conn=0; m_logfile=0;
  memset(&m_sttypthon,0,sizeof(struct st_typthon));
  memset(&m_sttypthon1,0,sizeof(struct st_typthon1));

CTYPTHON::~CTYPTHON()



//111111111111111111111111111111111111111111111111111111111111111111111
bool CTYPTHON::SplitBuffer(const char *strBuffer)
 //把用逗号分隔的记录拆分到m_sttypthon结构中
  totalcount++;
//  memset(&m_sttypthon1,0,sizeof(struct st_typthon));
  CCmdStr CmdStr;
  CmdStr.SplitToCmd(strBuffer," ",true);
  c= CmdStr.CmdCount();
  if(CmdStr.CmdCount()==9)
  
    memset(&m_sttypthon,0,sizeof(struct st_typthon));
    CmdStr.GetValue(3,m_sttypthon.cyclone,4); 
    CmdStr.GetValue(4,m_sttypthon.num,4); 
    CmdStr.GetValue(5,m_sttypthon.ws,1); 
    CmdStr.GetValue(6,m_sttypthon.hours,1); 
    CmdStr.GetValue(7,m_sttypthon.t_name,29); 
    CmdStr.GetValue(8,m_sttypthon.datasettime,19); 

  
  if (CmdStr.CmdCount()==6C/C++8天气APP:Oracle数据库安装,表操作,C语言操作Oracle数据库

C/C++9天气APP:Oracle的虚表/日期/序列,索引/视图/链路/同义词,数据库高可用性

C/C++13天气APP:数据挖掘/HTTP协议/非结构化数据存储(filetoblob.cpp),数据管理/监控告警(hsmtable.cpp,tbspaceinfo.cpp)

C/C++15天气APP:服务端(client.cpp,shtqappserver.cpp)

C/C++7天气APP:生成观测数据txt/xml文件(crtsurfdata.cpp),ftp协议及ftp采集模块(_ftp.h,_ftp.cpp,ftpgetfiles.cpp)

C语言 | JSON格式天气数据的解析(附详细代码)