C语言读入文本中的sql语句 插入到mysql数据库中

有一个txt 文件,里面全部是Insert into 的sql插入语句,现在想要把他们读出来,执行sql语句。
其中,每一条sql语句大概长这个样子:

Insert into EXPORT_TABLE (MSG_SEQ,MSG_ID,GATEWAY_TIME,PRIORITY,RCV_ADDRESS,SND_ADDRESS,BEP_TIME,SMI,AIRCRAFT_ID,FLIGHT_ID,DSP,RGS,RGS_TIME,MSN,SPLIT_STATE,RAW_MSG) values (947040075,'20190603200725DFDB-1428D07A',str_to_date('03-6     -19','%d-%m -%y'),'QU','BJSAGCA','DDLXCXA','032007','DFD','B-1428','CA991','DDL','YVR','032007','D07A','-5','QU BJSAGCA
.DDLXCXA 032007
DFD
FI CA991/AN B-1428
DT DDL YVR 032007 D07A
-  ACM01ACM270ASB-1428  CCA991  ZBAACYVR030619 104TA100145
213231763163BSM719139012151002
9012171002
092008 -01  03 256
091901 -02  04
2062  342 172   6  45 320 3100000000  918  3150
2050  340 190   6  45 319 3100000000  918  3112
  36  34  0  34  34000    0    0
  36  33  0  34  34    0    0
092055 -01  00 258
091949 -01  04
1660  392 564  11 224 722 3100000000 2272  3325
1615  385 622  11 221 722 3100000000 2268  3388
  44  44 42  39  41024    0    0
  44  44 34  39  41    0    0
100145 -02 -01 270
1862  895 651   3 558 950 3100000000 9850  5250
1887  898 718   3 556 947 310000000010222  5150
  87  95 52  73  78000    0    0
  87  94 41  73  80    0    0
100303-118 137 270 319 1922303
1707  808 837   3 9931161 320000000033364 11650
1612  818 915   3 9931159 320000000033028 11425
  73  85 43  75  82000    0    0
  73  85 35  76  83    0    0
100732  04  97 270 190 9684485
1812  856 765   3 9601126 190000000024426  9850
1720  867 817   3 9601122 190000000024368  9600
  78  88 43  81  83000    0    0
  78  90 36  81  86    0    0
101227 -05  56 270  7019927666
1845  895 706   3 9861117  70000000019930  9162
1785  907 767   2 9861114  70000000019946  8937
  79  91 53  82  84000    0    0
  81  93 47  84  85    0    0
103751  01  27 220-17531113823
1760  857 615   3 8521022-1700000000 9576  4688
1775  868 670   2 8521020-1800000000 9574  4575
  70  78 53  63  68000    0    0
  72  82 51  65  70    0    0
123723 -01  23 -30-19230999828
1737  784 628   3 8311013-1900000000 8994  4113
1737  791 690   3 8311011-1900000000 9004  4000
  64  72 51  57  60000    0    0
  66  74 50  60  63    0    0
143725 -02  23-130-19533000839
1675  671 640   4 8511021-2000000000 8944  4300
1675  684 714   3 8511019-1900000000 8918  4175
  54  62 54  52  54000    0    0
  56  64 49  56  57    0    0
163727 -02  22-170-26032998837
1635  622 633   4 8281002-2600000000 8450  3350
1637  637 706   4 8281001-2600000000 8440  3250
  48  57 61  45  48000    0    0
  50  59 59  48  51    0    0
183729 -02  19-200-21033002840
1632  623 642   4 8291008-2100000000 8232  3813
1575  639 712   4 8291006-2100000000 8254  3700
  49  57 46  47  50000    0    0
  52  59 48  51  53    0    0
194215 -02  19-180-17033005833
1637  674 634   4 8211011-1700000000 8174  4263
1637  691 699   4 8211009-1700000000 8164  4150
  55  62 40  52  55000    0    0
  57  64 36  56  58    0    0
200536  01 -02-130
1737  678 420   4 217 707 2000000000 2318  2275
1737  687 462   3 216 707 2000000000 2312  2212
  64  70 47  54  58000    0    0
  64  70 34  54  61    0    0
');

思路一开始是:首先查找到"INSERT" 这个字符的首位置 然后查找;结束,这样的话就是一条完整的insert into
语句了 ,将其存在一个buffer中,然后使用:

mysql_real_query(&mysql, strstr_s, strlen(strstr_s));

就执行了一条插入语句了。

实验步骤如下:
1.每次读入一行的话,首先使用strstr函数查找到“INSERT”的首位置,如果找到,说明这是一个insert into语句的开始,从这里开始,把内容开始存进buffer数组里面,继续读一行。。。每读一行,使用strrchr 函数 ,从末尾开始查找,";“第一次出现的位置,如果找到,说明这个insert 语句读完了, 把buffer传过来就行了。
这里出现了一点问题,刚开始设置的每一行最多读入的数据大小是1024个字符,通过实验,发现可能不够,遂改为3200,然后就是以为每个insert语句中只有一个”;"
但该文本文件中出现了这种:

Insert into EXPORT_TABLE (MSG_SEQ,MSG_ID,GATEWAY_TIME,PRIORITY,RCV_ADDRESS,SND_ADDRESS,BEP_TIME,SMI,AIRCRAFT_ID,FLIGHT_ID,DSP,RGS,RGS_TIME,MSN,SPLIT_STATE,RAW_MSG) values (947024134,'20190603180648TT6B-1368600A',str_to_date('03-6   -19','%d-%m -%y'),'QU','BJSAGCA','DDLXCXA','031806','TT6','B-1368','CA879','DDL','YUL','031806','600A','-5','QU BJSAGCA
.DDLXCXA 031806
TT6
FI CA879/AN B-1368
DT DDL YUL 031806 600A
-  <E10B0006000066>CA B-1368CCA879----1408190603180555ZBAACYUL10427155958513670(v-I)z*8*y*8;''>.?K>y!}!}-!!!!+^&}''!!!!#!!"!!!!!!}}$}!!''!}"!!!!"#"$"!!!!"!!"!!!!!!5#",!"""/""##$#"""""$#""""""""""""""##%%''>^}_7(*(!!!!!!!!!!!!!!""""""""""""/&"""""""#"$#"""$$7z}G.''"!!!!!!!!!!!!!!!!!"""""""""""""""2$"$%##"$$,\}}1*"!!!!!!""""""""""#"!""""""""77!!!!!!!&$$$""#8O}}}i0)!!!!!##"&>,''#"#%\}}}h2"!!!!!!!!!!!!!!!!!}}/!!!!!!!!!!!!}}1"!!!!!!!!!L}08!!!"""!!!!""""!!!!!""""!!!!!!!""#""!!!!!!!!!!"""""!!!!!!!!!""$*)"!!!!!!!!!"$.C("!!!!!!!!!"#P}%"!!!!!!!!!".g8""!!!!!!!!""(+$%!!!!!!!!!"""%&!!!!!!!!""#$!!!!!!!"#""!!!!!!!!!!!!!"""""$}}$!!!!!!!!!!"##)}Y%!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!e}}}.-%"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!AD("!!!!!!}}}}}}}}}}}}}}}}}}}}!!-=/,)(}}}}}}}}}}}}!!!!%2/+*+*}}}}}}}}}!!!!!!!!!!!!!!!N}vSA!!!!!!!!!!!}}!!!!!!!!!!P}wY:!!!!!!!!!!!!!!!!!!!!!!!!!!!!"""""""""""""""""""""""""#$%&+.5\}}}1''$"""""""!!!!"""""""""""""""##''(/7c}}f)$##""""!!!!!!!!!!!!!!!!!!!!"#""#""!""""""""""!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!k}}}J''''.}!!!!!!!!!!!!~~!!!!!!!!!!!!!!!!!5.4#!!!!!!!!!!!!!!!!!!!!!!!!!A6!!!!!!!!!!!!!!!!!!!!@#6!!!!!!!!!!!!"#%''011*,+%%$#)2R%!!!!!!!!!!!!!!!!&6I6($AE+!!!!!!!!!"(>B3($<S!!!!!!!!!!!!!!!!!!!!!!!!"""""""""""""#).;T6+$""$"!!!!!!!!""""(6YK)$#"!!!!!!!!!!!""""$.?a7$$!!!!!!!"K#""""""$"""""""""""""!!!!D''#""""""""""""#"!!!!*B$"""#$#""""!!!"""""""""""""#$%$&&&&($#!!!!!!!!!!!!!!!!!!!!!!!!!!!#"""""""")+.+!!!!!!!!!!!!!!!!!!!!!!!#"##+./%!!!!!!!!!!!!""#%.=Xw}}}rN5)#""""!!!k!!!!!!!!!!!!!!!!%!!!!!!~~~~~~~~~~~~~~~!!!!!!!!!!%5I51##"""$$#!!!!!!!!!!!!!!!!!!!!!!!!"###"##$$""""""""#"!#(+&%##-$""##"""$#"""!!"%"!!!!!!!!(#!!!!!!!!%!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!~~~~~/"#7}/#!""%hsav*,--/0/143#"""##$%&*#""#&%*AD2~~5=PR\^aq...*&$%~~~~~~~228)6080G5}}1%(+(-)&&&''@+0/.5D:A??A=9442312~~YXSFzir^\]g\VQV[[U~~~~FD>5555:8-,1.,0(~~'''')(''()159$$$####&(*#######%%&""##"""###(%$$$$&''''*""#""#$/(&"""""##%'')2''##%%%''(''"~~~~~~~~~~~W~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~&(1)''%%$$%&%%''(+*,++"""""""""##$$%%''''''))&&&&&&''''()~~%%%$#&+)''''+2268931~~%$$##%%&$$%*,+**,.m]SR~~~~~~~~~~~~~~~~~~~~%$%%$%$*..,+**,(~~~~%#$$#$#$$*&''''&&%0)7+()(+'')''((*/)*+--"#####"%$%%%%''''''''(*+~~)&#%$$(((.3277<112~~(#"$$#$$%&),,.,)(-~~~~%(&($%%+*,+()*0/~~~~$$$%$$$$$&%%&''(,)(*&%&&&''''%$$###$#$$$$%$%%&''''("""#''(.:4%"""""""""~}|||||{{{{||||||||||}qooruusrxrstv{|{{|{||||||||||||||||||||}|||||{{||||||||||||}qooquutsxssuv{|{{|{||||||||||||||||||||~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~BA@??&"""41%"..5*/)?;''""#"#"""""q~"""$#%%&(~"""""""""X~~%#")+''''#~~$""""#""M%%$$#$$%$$~(%%%$$%%&~~$""$%%)+$&%%%%)%((~#""#"$#%%~~"""#>Z%)$#"###+(##~%"$####$%~~"""#&($$~&&##"####~#$"""""""58190H5}}3$&''''(''''((+%HL=,''''''(*#$$#$$###$)+,+++,+,.%&''&''&&&%''%''))+12310$$&%''&%''&(+17.013458&''+''+))++-3.=6;;<@FM))+)0--/-1~###''*&()*~"#"#$$$''''~$##(),)11~##"$$&&)+~#""$"$&&&~"""""""$$~#"#(%%$%%~"""$"$##$]N~~~~~~(()**)~ttttii-,~~"~~"""~"""#""""""""""""#"""""""$#$#1+,2)"$"#""""""""""#"""""""###""""""###""""j"!&""""#-"2#""""#"""""""""!*"3)M07DGOGPGMGN5J5L5K5M
');

该方法失败,经过观察发现 “);” 这种格式的只出现一次,且只出现在末尾。于是,首先查找";",返回的指针-- 如果此时的值是“)”说明进入到结尾了,完成!
代码如下:

char strstr_s[5000];
    char temp_2[3200];
    FILE *file_2=NULL;
	file_2 = fopen("/mnt/hgfs/F/2019/2.txt","r" );
	if(!file_2)
	{
		perror("open error");
		exit(1);
	}
	int label=0;
	int number=0;
	while(!feof(file_2))//only read three times
    {
    	fgets(temp_2,3200,file_2);
    	char *p1=strstr(temp_2,"Insert");
    	if(p1 == temp_2)
    	{	
    		strcat(strstr_s,temp_2);
    		fgets(temp_2,3200,file_2);
    		if(feof(file_2)) break;
    		char *p2=strrchr(temp_2,';');
    		while(!p2)
    		{
    		strcat(strstr_s,temp_2);
    		//printf("strstr_s=%s",strstr_s);
    		fgets(temp_2,3200,file_2);
    		p2=strrchr(temp_2,';');	
    		}
    		/*
    		if(p2 != NULL)
    		{
    		  
    			strrchr(temp_2,';');
    			strcat(strstr_s,temp_2);
    			
    			mysql_real_query(&mysql, strstr_s, strlen(strstr_s));
    			printf("strstr_s=%s",strstr_s);
    			memset(strstr_s,0,sizeof(strstr_s));	
    		}
    		*/	
    		while(p2 != NULL)
    		{
    			p2--;
    			if(*p2==')')
    			{
    				strcat(strstr_s,temp_2);
    			
    			    mysql_real_query(&mysql, strstr_s, strlen(strstr_s));
    				printf("strstr_s=%s",strstr_s);
    				memset(strstr_s,0,sizeof(strstr_s));
    				break;	
    			}
    			else
    			{
    				strcat(strstr_s,temp_2);
    				fgets(temp_2,3200,file_2);
    				p2=strrchr(temp_2,';');	
    				
    			}
    		  
    			
    		}
    		
    	}
    }

最后将该文本文件的内容,全部读出来,存到了sql 文件中,2.8G的文本内容,大概跑了5个小时才跑完,存入数据4325029条记录,可能是我的程序有问题,感觉效率还是比较低下,可能使用正则表达式要快一点,慢慢学习中,看看能不能改进一下,使他的读入速度更快一点!

哦,还有个问题,原文本文件大概2.8G,我读入mysql后 导出的sql文件才1.9G,不知道为什么少了这么多,难道是系统进行了优化???

上一篇:原生js封装轮播图


下一篇:php – strstr()的参数计数错误