今天上午把昨天晚上 碰到的问题终于解决了,而且实现了高效的数据插入,每秒插入数据库的记录初略估计接近100条。感觉很棒!昨晚没有打开警告,-w没有填写,退出的原因是 由于记录id的文本,可能由于同时的读写,在读的时候,文件上锁,而这个时候在写入的时候,就发生了权限问题。write_file()方法有问题。今天 查询了该模块,突然发现有个函数:overwrite_file(),实现了该功能。可以非常方便的进行文件的改写,于是问题解决了。
下次可以直 接用一个文本作为一个指针进行记录,实现文件的同时读写。不用担心锁问题了。
哈哈,开心!
代码如下(与PHP有些类似):
#! perl use DBI; use File::Slurp; my $dir = "F:/www/tmp/20001_40000/"; #创建文件夹和图片的目录 my $min = 60001; my $max = 80000; open ERROR,">>F:/www/tmp/errorID.txt" or die $!; my $dbh = DBI->connect("DBI:mysql:database=patent;host=192.168.200.254","dxy","p0o9i8u7"); $dbh->do("set names gb2312"); #注意这里的编码是根据你pl文件的编码格式来的。 my $sth = $dbh->prepare("insert into patent(id,applyNum,applyDate,publicDate,issueDate,openNum,notifyNum,authDate,authNotifyDate,patentType, countryCode,agentOrgCode,agent,invention,intelTypeNum,catagoryNum,inventor,application,applyAddress, zip,digest,mainClaims,priorityItem,pct,publicSpecUrl,publicSpecPages,authSpecUrl,authSpecPages) values (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)"); #28 个值 while($min <= $max){ my $idFile = "F:/www/tmp/id.txt"; $id = read_file($idFile); $HTMLfile = $dir.$id.".html"; if(-e($HTMLfile)){ my $data = read_file($HTMLfile); #现在读取的是html文件 #getPublicSpecification($data,$location); #getAuthSpecification($data,$location); my @result = getTableValue($id,$data); $sth->execute($result[0],$result[1],$result[2],$result[3],$result[4],$result[5],$result[6], $result[7],$result[8],$result[9],$result[10],$result[11],$result[12],$result[13], $result[14],$result[15],$result[16],$result[17],$result[18],$result[19],$result[20], $result[21],$result[22],$result[23],$result[24],$result[25],$result[26],$result[27]); } $id++; $min = $id; sleep(0.1); overwrite_file($idFile,$id); print "insert $id successfully /n"; } $dbh->disconnect; #获取公开说明书中的下载地址,把获取到的data输出到给定的目录地址。记住地址的最后有/ sub getPublicSpecification($){ my $data = shift; if($data =~ /<!--公开说明书form-->.*?<input name="picstr" type="hidden" id="picstr" value="(.*?)".*?<input name="PAGE" type="hidden" id="PAGE" value="(/d+)"/s){ my $url = $1; my $nums = $2; my @PublicSpec; push(@PublicSpec,$url); push(@PublicSpec,$nums); return @PublicSpec; }else{ return ("",0); } } #获取授权说明书中的下载地址 sub getAuthSpecification($){ my $data = shift; if($data =~ /<!--授权说明书form-->.*?<input name="picstr" type="hidden" id="picstr" value="(.*?)".*?<input name="PAGE" type="hidden" id="PAGE" value="(/d+)"/s){ my $url = $1; my $nums = $2; my @AuthSpec; push(@AuthSpec,$url); push(@AuthSpec,$nums); return @AuthSpec; }else{ return ("",0); } } sub getTableValue($$){ my $id = shift; my $data = shift; if($data =~ / <td/swidth="110"/sheight="20"/sbgcolor="/#CCool6EE"> 申请号: <//td>.*? <td/swidth="155"/sheight="20"/sbgcolor="/#FFFFFF"> (/d+) <//td>.*? <td/swidth="110"/sheight="20"/sbgcolor="/#CCool6EE"> 申请日: <//td>.*? <td/swidth="224"/sheight="20"/sbgcolor="/#FFFFFF"> (.*?) <//td>.*? <td/swidth="110"/sheight="20"/sbgcolor="/#CCool6EE"> 公开日:<//td>.*? <td/sheight="20"/sbgcolor="/#FFFFFF"> (.*?) <//td>.*? <td/swidth="110"/sheight="20"/sbgcolor="/#CCool6EE"> 公告日:<//td>.*? <td/sheight="20"/sbgcolor="/#FFFFFF"> (.*?) <//td>.*? <td/swidth="110"/sheight="20"/sbgcolor="/#CCool6EE"> 公开号: <//td>.*? <td/sheight="20"/sbgcolor="/#FFFFFF"> (.*?) <//td>.*? <td/swidth="110"/sheight="20"/sbgcolor="/#CCool6EE"> 公告号:<//td>.*? <td/sheight="20"/sbgcolor="/#FFFFFF">(.*?)<//td>.*? <td/swidth="110"/sheight="20"/sbgcolor="/#CCool6EE">授权日:<//td>.*? <td/sheight="20"/sbgcolor="/#FFFFFF">(.*?)<//td>.*? <td/swidth="110"/sheight="20"/sbgcolor="/#CCool6EE">授权公告日:<//td>.*? <td/sheight="20"/sbgcolor="/#FFFFFF">(.*?)<//td>.*? <td/swidth="110"/sheight="20"/sbgcolor="/#CCool6EE">专利类别:<//td>.*? <td/sheight="20"/sbgcolor="/#FFFFFF">/s*(.*?)<//td>.*? <td/swidth="110"/sheight="20"/sbgcolor="/#CCool6EE">国别省市代码:<//td>.*? <td/sheight="20"/sbgcolor="/#FFFFFF">(.*?)<//td>.*? <td/swidth="110"/sheight="20"/sbgcolor="/#CCool6EE">代理机构代码:<//td>.*? <td/sheight="20"/sbgcolor="/#FFFFFF">(.*?)<span.*? <td/swidth="110"/sheight="20"/sbgcolor="/#CCool6EE">代理人:<//td>.*? <td/sheight="20"/sbgcolor="/#FFFFFF">(.*?)<//td>.*? <td/swidth="110"/sheight="20"/sbgcolor="/#CCool6EE">发明名称:<//td>.*? <td/sheight="20"/scolspan="3"/sbgcolor="/#FFFFFF">(.*?)<//td>.*? <td/swidth="110"/sheight="20"/sbgcolor="/#CCool6EE">国际分类号:<//td>.*? <td/sheight="20"/scolspan="3"/sbgcolor="/#FFFFFF">(.*?)<//td>.*? <td/swidth="110"/sheight="20"/sbgcolor="/#CCool6EE">范畴分类号:<//td>.*? <td/sheight="20"/scolspan="3"/sbgcolor="/#FFFFFF">(.*?)<//td>.*? <td/swidth="110"/sheight="20"/sbgcolor="/#CCool6EE">发明人:<//td>.*? <td/sheight="20"/scolspan="3"/sbgcolor="/#FFFFFF">(.*?)<//td>.*? <td/swidth="110"/sheight="20"/sbgcolor="/#CCool6EE">申请人:<//td>.*? <td/sheight="20"/scolspan="3"/sbgcolor="/#FFFFFF">(.*?)<//td>.*? <td/swidth="110"/sheight="20"/sbgcolor="/#CCool6EE">申请人地址:<//td>.*? <td/sheight="20"/scolspan="3"/sbgcolor="/#FFFFFF">(.*?)<//td>.*? <td/swidth="110"/sheight="20"/sbgcolor="/#CCool6EE">邮编:<//td>.*? <td/sheight="20"/scolspan="3"/sbgcolor="/#FFFFFF">(.*?)<//td>.*? <td/sheight="20"/scolspan="4"/sbgcolor="/#CCool6EE">文摘:<//td>.*? <td/sheight="20"/scolspan="4"/sbgcolor="/#FFFFFF"><span/sclass="line18"/sstyle="padding:5px;">(.*?)<//span><//td>.*? <td/sheight="20"/scolspan="4"/sbgcolor="/#CCool6EE">主权利要求:<//td>.*? <td/sheight="20"/scolspan="4"/sbgcolor="/#FFFFFF"><span/sclass="line18"/sstyle="padding:5px;">(.*?)<//span><//td>.*? <td/sheight="20"/scolspan="4"/sbgcolor="/#CCool6EE">优先权项:<//td>.*? <td/sheight="20"/scolspan="4"/sbgcolor="/#FFFFFF"/sstyle="padding-left:10px;"/s>/s+(.*?)<//td>.*? <td/sheight="20"/scolspan="4"/sbgcolor="/#CCool6EE">PCT/s项<//td>.*? <td/sheight="20"/scolspan="4"/sbgcolor="/#FFFFFF"/sstyle="padding-left:30px;">/s+(.*?)/s+<//td>/s+<//tr>/s+<tr>/s+<td/sheight="20"/sbgcolor="#CCool6EE">法律状态: /xs){ # my $applyNum = $1; #申请号 # my $applyDate = $2; #申请日 # my $publicDate = $3; #公开日 # my $issueDate = $4; #公告日 # my $openNum = $5; #公开号 # my $notifyNum = $6; #公告号 # my $authDate = $7; #授权日 # my $authNotifyDate = $8; #授权公告日 # my $patentType = $9; #专利类别 # my $countryCode = $10; #国别省市代码 # my $agentOrgCode = $11; #代理机构代码 # my $agent = $12; #代理人 # my $invention = $13; #发明名称 # my $intelTypeNum = $14; #国际分类号 # my $catagoryNum = $15; #范畴分类号 # my $inventor = $16; #发明人 # my $application = $17; #申请人 # my $applyAddress = $18; #申请人地址 # my $zip = $19; #邮编 # my $digest = $20; #文摘 # my $mainClaims = $21; #主权利要求 # my $priorityItem = $22; #优先权项 # my $pct = $23; #PCT项 my @publicSpec = getPublicSpecification($data); my @authSpec = getAuthSpecification($data); $publicSpecUrl = $publicSpec[0]; $publicSpecPages = $publicSpec[1]; $authSpecUrl = $authSpec[0]; $authSpecPages = $authSpec[1]; my @results; push(@results,$id,$1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11,$12,$13,$14,$15,$16,$17,$18,$19,$20,$21,$22,$23,$publicSpecUrl,$publicSpecPages,$authSpecUrl,$authSpecPages); return @results; }else{ print ERROR $id."/n"; print "no match-------------------------------------->/n" } }
终于搞定了!