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

📄 sqlloader_dbf.cpp

📁 加载数据库的程序。 This is a program to load the sql file.
💻 CPP
字号:
#include < stdio.h >
#include < stdlib.h >
#include < iostream.h >
#include < fstream.h >
#include < string.h >
#include < math.h >
#define MAX_ROW_LENGTH 1200
#define MAX_FIELD_NUMBER 30
typedef struct head 						// dbf头文件结构
{ unsigned char mask ;
unsigned char date[3] ;
unsigned long record_num;
unsigned short int head_length;
unsigned short int field_length ;
} HEAD ;
typedef struct field 						// dbf字段结构
{ unsigned char name[11];
unsigned char type ;
unsigned long add;
unsigned char length;
unsigned char dec ;
} FIELD ;

int main(int argc,char **argv)
{ char buf[MAX_ROW_LENGTH],dbf[40],*sqlload;
unsigned int i,field_num;
HEAD *dbfhead ;
FIELD dbffield[MAX_FIELD_NUMBER];
FILE *fout, *fp;

if (argc!=2)
{ cout << "Usage : load dbfile" << endl ;
return -1;
}

sqlload = new char(40);
dbfhead = new HEAD;
strcpy(buf,"");

strcpy(dbf,argv[1]);
strcat(dbf,".dbf");
if ((fp=fopen(dbf,"rb")) == NULL)
{ cout << "Cannot open file " << dbf << endl;
return -1 ;
}
fseek(fp,0,SEEK_SET);
fread(dbfhead,sizeof(HEAD),1,fp); 			// 读dbf头文件信息

field_num = (dbfhead->head_length-1)/32 -1 ; 		//字段个数

for( i=0; i< field_num; i++)
{ fseek(fp,32*(i+1),SEEK_SET);
fread(&dbffield[i],sizeof(FIELD),1,fp); 			// 读dbf结构信息
}
 
 // 产 生SQL*Loader 控 制 文 件
strcpy(sqlload,argv[1]);
strcat(sqlload,".ctl");
if ((fout=fopen(sqlload,"w")) == NULL)
{ cout << "Cannot open file " << sqlload << endl;
return -1 ;
}
fprintf(fout,"LOAD DATA\n");
fprintf(fout,"INFILE '%s.txt'\n", argv[1]);
fprintf(fout,"INTO TABLE %s (\n", argv[1]);

for(i=0;i< field_num;++i)
{ fprintf(fout, "%11s POSITION(%d:%d)", dbffield[i].name,
		  dbffield[i].add, dbffield[i].add + dbffield[i].length -1 );
switch (dbffield[i].type)
{ case 'C':
case 'L': 							//字符型/逻辑型
	fprintf(fout, " CHAR");
	break ;
case 'N':
	if (dbffield[i].dec == 0 ) 				//整数型
		fprintf(fout, "INTEGER EXTERNAL NULLIF %s = BLANKS",
		dbffield[i].name); 
	else 							//实数型
		fprintf(fout, " DECIMAL EXTERNAL NULLIF %s =BLANKS",
		dbffield[i].name );
	break;
case 'D': 							//日期型
	fprintf(fout, " DATE 'YYYYMMDD' NULLIF %s = BLANKS",
		dbffield[i].name);
	break;
default:
	break;
}
if(i< field_num -1)
fprintf(fout, ",\n") ;
}
fprintf(fout, ")\n");
fclose(fout);
 
// 产生CREATE TABEL的SQL语句
strcpy(sqlload,argv[1]);
strcat(sqlload,".sql");
if ((fout=fopen(sqlload,"w")) == NULL)
{ cout << "Cannot open file " << sqlload << endl;
return -1 ;
}
fprintf(fout, "create table %s (\n", argv[1]);
for(i=0;i< field_num;i++)
{ fprintf(fout,"%11s",dbffield[i].name);
switch (dbffield[i].type)
{ case 'C': 							//字符型
fprintf(fout, " CHAR(%d)",dbffield[i].length);
break;
case 'L': 							//逻辑型
	fprintf(fout, " CHAR(1)");
	break;
case 'N': 							//数字型
	if (dbffield[i].dec==0)
		fprintf(fout," NUMBER(%d)", dbffield[i].length) ;
	else
		fprintf(fout, " NUMBER(%d,%d)",
		dbffield[i].length-1, dbffield[i].dec);
	break;
case 'D': 							// 日 期 型
	fprintf(fout, " DATE");;
	break;
default:
	break;
}
if (i< field_num - 1)
fprintf(fout, ",\n");
}
fprintf(fout, ")\n");
fclose(fout);
 
// 产生SQL*Loader数据文件
strcpy(sqlload,argv[1]);
strcat(sqlload,".txt");
if((fout=fopen(sqlload,"w")) == NULL)
{ cout << "Cannot open file " << sqlload << endl;
return -1 ;
}
fseek(fp,dbfhead->head_length,SEEK_SET);
for(i=0;i< dbfhead->record_num;i++)
{ fread(buf,dbfhead->field_length,1,fp);
buf[dbfhead->field_length] ='\0';
fprintf(fout,"%s\n", buf+1); 				//skip记录首字节(删除标志)
}
fclose(fout);
fclose(fp);
delete sqlload;
return 0 ;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -