有一个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,不知道为什么少了这么多,难道是系统进行了优化???