📄 ping2db.c
字号:
/*
初建日期: 2001-6-10
作 者: 邹建国
Email: z_j_g@sohu.com zou_jg@sina.com
程序功能: 此程序用于解析 ping 命令产生的数据,生成一个格式化的表格形式
的纯文本文件(.PAR) 和一个用于EXCEL和FOXPRO 导入数据的格式文件(.PDB)
编译环境: Borland C/C++ 3.1 DOS Windows 98
BCC PING2DB.C
*/
#include <io.h>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <ctype.h>
#define LEFT 0
#define RIGHT 1
int makefname(char *name,char *fname,char *ext);
int GetStr(char *line,char *startstr,char *endstr,char *retstr);
int Parse(char *line,char *result);
void trip(char *str);
int FindStr(char *line,char *str);
int IsEmptyLine(char *line);
int StrStyle(char *str,int len,int style);
int GetStrAddMark(char *line,char *startstr,char *endstr,char *retstr);
FILE *fp_in;
/////////////////////////////////////
int main(int _argc,char *_argv[])
/////////////////////////////////////
{
FILE *fp_out;
FILE *fp_out2;
char line[255];
char fname[255];
char result[255];
if (_argc < 2) {
printf("Usage: Ping2db [FileName]\n");
exit(0);
}
if(access(_argv[1],0)!=0){
printf("File %s doesn't exist!\n",_argv[1]);
exit(1);
}
fp_in=fopen(_argv[1],"rt");
if(!fp_in){
printf("Error to open file: %s!\n",_argv[1]);
exit(1);
}
makefname(_argv[1],fname,"PAR");
fp_out=fopen(fname,"wt");
if(!fp_out){
printf("Error to creat file: %s!\n",fname);
exit(2);
}
printf("Parse to %s !\n",fname);
makefname(_argv[1],fname,"PDB");
fp_out2=fopen(fname,"wt");
if(!fp_out2){
printf("Error to creat file: %s!\n",fname);
exit(3);
}
printf("%s can be imported by FoxPro or Excel!\n",fname);
fputs(" Start time IP address Send Rece Lost Lost% Min Max Ave End\n",fp_out);
fputs("========================================================================================\n",fp_out);
/*
sprintf(result,"12345");
StrStyle(result,10,RIGHT);
puts(result);
return 0;
*/
while(!feof(fp_in)){
fgets(line,254,fp_in);
if(feof(fp_in))break;
if(line[0]=='P'&& line[1]=='e')continue;
Parse(line,result);
// if(getch()==27)break;
fwrite(result,1,strlen(result),fp_out);
}
fseek(fp_in,0,0);
while(!feof(fp_in)){
fgets(line,254,fp_in);
if(feof(fp_in))break;
if(line[0]=='P'&& line[1]=='e')continue;
Parse2(line,result);
fwrite(result,1,strlen(result),fp_out2);
}
fclose(fp_in);
fclose(fp_out);
fclose(fp_out2);
return 0;
}
///////////////////////////////////////////////////////////////////
void trip(char *str)
//将会车符变成空格
///////////////////////////////////////////////////////////////////
{
int i,slen;
slen=strlen(str);
for(i=0;i<slen;i++){
if(str[i]==0xa)str[i]=0x20;
// printf("%c-%02x ",str[i],str[i]);
}
}
///////////////////////////////////////////////////////////////////
int makefname(char *name,char *fname,char *ext)
// 将name字符串去掉.后的字符加入ext指定的扩展名放入fname中
///////////////////////////////////////////////////////////////////
{
int i,len;
char *dot;
len=strlen(name);
strcpy(fname,name);
dot=memchr(fname,'.',len);
if(dot){
*(dot+1)=ext[0];
*(dot+2)=ext[1];
*(dot+3)=ext[2];
*(dot+4)=0;
return 1;
}
strcat(fname,".");
strcat(fname,ext);
return 1;
}
///////////////////////////////////////////////////////////////////
int Parse(char *line,char *result)
//解析ping产生的数据文件,产生表格形式的文本文件
///////////////////////////////////////////////////////////////////
{
int len,slen;
char tmp[255];
slen=strlen(line);
if(len==0)return 0;
if(IsEmptyLine(line)){
printf("%s is empty!\n",line);
return 0;
}
len=GetStr(line,"\0" , "/2001",result);
// printf("len=%d %s \n",len,result);
if(len){
fgets(line,254,fp_in);
strcat(result,line);
len=strlen(result);
result[len-1]=' ';
result[len]=0;
return 1;
}
// printf("len=%d %s \n",len,result);
if(len){
StrStyle(result,16,LEFT);
return 1;
}
len=GetStr(line,"Pinging" , "with",result);
// printf("len=%d %s \n",len,result);
if(len){
StrStyle(result,16,LEFT);
return 1;
}
len=GetStr(line,"Sent = " , ", R",tmp);
if(len){
StrStyle(tmp,6,RIGHT);
strcat(result,tmp);
len=GetStr(line,"Received = ", ", L",tmp);
if(len){
StrStyle(tmp,6,RIGHT);
strcat(result,tmp);
}
len=GetStr(line,"Lost = " , "(",tmp);
if(len){
StrStyle(tmp,6,RIGHT);
strcat(result,tmp);
}
len=GetStr(line,"(","loss",tmp);
if(len){
StrStyle(tmp,6,RIGHT);
strcat(result,tmp);
}
return 1;
}
len=GetStr(line,"Minimum = ",", Ma",tmp);
if(len){
if(len){
StrStyle(tmp,8,RIGHT);
strcat(result,tmp);
}
len=GetStr(line,"Maximum = ", ", Av",tmp);
if(len){
StrStyle(tmp,8,RIGHT);
strcat(result,tmp);
}
len=GetStr(line,"Average = " , "\n",tmp);
if(len){
strcat(result,tmp);
len=strlen(result);
result[len-1]=' ';
result[len]=0;
}
return 1;
}
if(slen<9 && slen>4){
// printf("%s =%d\n",line,len);
strcpy(result,line);
StrStyle(result,8,RIGHT);
result[9]=0;
return 1;
}
return 0;
}
///////////////////////////////////////////////////////////////////
int Parse2(char *line,char *result)
//解析ping产生的数据文件并在各字段间加入逗号,用于excel和foxpro等软件导入数据
///////////////////////////////////////////////////////////////////
{
int len,slen;
char tmp[255];
slen=strlen(line);
if(len==0)return 0;
if(IsEmptyLine(line)){
printf("%s is empty!\n",line);
return 0;
}
len=GetStrAddMark(line,"\0" , "/2001",result);
if(len){
fgets(line,254,fp_in);
strcat(result,line);
len=strlen(result);
result[len-1]=',';
result[len]=0;
return 1;
}
len=GetStrAddMark(line,"Pinging" , "with",result);
if(len){
return 1;
}
len=GetStrAddMark(line,"Sent = " , ", R",tmp);
if(len){
strcat(result,tmp);
len=GetStrAddMark(line,"Received = ", ", L",tmp);
if(len){
strcat(result,tmp);
}
len=GetStrAddMark(line,"Lost = " , "(",tmp);
if(len){
strcat(result,tmp);
}
len=GetStrAddMark(line,"(","% loss",tmp);
if(len){
strcat(result,tmp);
}
return 1;
}
len=GetStrAddMark(line,"Minimum = ","ms, Ma",tmp);
if(len){
if(len){
strcat(result,tmp);
}
len=GetStrAddMark(line,"Maximum = ", "ms, Av",tmp);
if(len){
strcat(result,tmp);
}
len=GetStrAddMark(line,"Average = " , "ms\n",tmp);
if(len){
strcat(result,tmp);
}
return 1;
}
if(slen<9 && slen>4){
strcpy(result,line);
// len=strlen(result);
// result[len]=',';
// result[len]=0;
return 1;
}
return 0;
}
///////////////////////////////////////////////////////////////////
int IsEmptyLine(char *line)
//是否空行
///////////////////////////////////////////////////////////////////
{
while(*line){
line++;
if( !isspace(*line)){return 0;}
}
return 1;
}
///////////////////////////////////////////////////////////////////
int GetStrAddMark(char *line,char *startstr,char *endstr,char *retstr)
//得到指定两个字符串之间的字符串后增加一个逗号
///////////////////////////////////////////////////////////////////
{ int len;
len=GetStr(line,startstr,endstr,retstr);
if(len){
len=strlen(retstr);
retstr[len]=',';
retstr[len+1]=0;
return len+1;
}
return 0;
}
///////////////////////////////////////////////////////////////////
int GetStr(char *line,char *startstr,char *endstr,char *retstr)
//得到指定两个字符串之间的字符串
///////////////////////////////////////////////////////////////////
{
int len,slen,s,e,s2;
len=strlen(line);
slen=strlen(startstr);
s=FindStr(line,startstr)+slen;
if(startstr[0]=='\0')s=0;
e=FindStr(line,endstr);
// printf("%s %s=%d %s=%d\n",line,startstr,s,endstr,e);
if(s>-1 && e>-1){
memcpy(retstr,line+s,e-s);
retstr[e-s]=0;
// printf("GetStr %s=%d %s=%d\n ret=%s\n",startstr,s,endstr,e,retstr);
return e-s;
}
*retstr=0;
return 0;
}
/////////////////////////////////////////
int FindStr(char *line,char *str)
//在字符串line中查找字符串str,并返回首位置
/////////////////////////////////////////
{
int i,len=0,lenstr;
// printf("%s\n%s",line,str);
lenstr=strlen(str);
len=strlen(line);
if(str[0]=='\n')return len;
for(i=0;i<len;i++){
if(line[i]==str[0]){
if(lenstr==1)return i;
if(strncmp(str+1,line+i+1,lenstr-1)==0){
// printf("find %s in %s =%d\n",str,line,i);
return i;
}
}
// else putchar(line[i]);
}
return -1;
}
/////////////////////////////////////////
int StrStyle(char *str,int len,int style)
// 将字符串str按style设定的风格进行左、右对齐,不够长度len的补空格
/////////////////////////////////////////
{
int i,slen,addlen;
slen=strlen(str);
addlen=len-slen;
// printf("addlen=%d style=%d\n",addlen,style);
if(addlen>0){
if(style==LEFT){
for(i=slen;i<len;i++){
str[i]=' ';
}
str[i]=0;
}
if(style==RIGHT){
for(i=slen;i>=0;i--)
str[i+addlen]=str[i];
for(i=0;i<addlen;i++)
str[i]=' ';
str[len]=0;
// puts(retstr);
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -