免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2142 | 回复: 3
打印 上一主题 下一主题

用perl写的一个导库程序 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-07-21 15:10 |只看该作者 |倒序浏览
本帖最后由 litdong 于 2010-07-21 17:59 编辑

刚学perl,google了些网上的sample code组合了一下,觉得很乱,帮忙看看如何改进,大致是这样,数据库被导出成xml格式,需要perl解析xml并写到数据库中


  1. #!/usr/bin/perl -w
  2. use strict;
  3. use XML::LibXML;
  4. use XML::LibXML::Common;
  5. use DBI;


  6. # 处理参数传入,如果没有参数,则显示提示帮助信息给用户
  7. if ( @ARGV < 1 ) {
  8.         print STDERR "\n == INTRODUCTION ==\n";
  9.         print STDERR "\n == PARAMETERS ==\n";
  10.         print STDERR "  -f <mandatory input> xml file you want to load\n";
  11.         print STDERR "  -h <mandatory input> database host name  \n";
  12.         print STDERR "  -u <mandatory input> database user name  \n";
  13.         print STDERR "  -p <optional input> database password,default is empty \n";
  14.         print STDERR "  -d <mandatory input> database name  \n";
  15.         print STDERR "\n == EXAMPLE ==\n";
  16.         print STDERR "$0 -f /usr/demo.xml -h 135.252.234.35 -u mysql -p -d fmbb \n";
  17.         exit;
  18. }

  19. my ( $temp, $xmlfile, $hostname, $username, $password, $databasename, );


  20. # 密码缺省可设置为空
  21. $password = "";


  22. #遍历参数,赋予相应变量
  23. while (@ARGV) {
  24.         $temp = shift;
  25.         if    ( $temp eq "-f" ) { $xmlfile      = shift; }
  26.         elsif ( $temp eq "-h" ) { $hostname     = shift; }
  27.         elsif ( $temp eq "-u" ) { $username     = shift; }
  28.         elsif ( $temp eq "-p" ) { $password     = shift; }
  29.         elsif ( $temp eq "-d" ) { $databasename = shift; }
  30.         else {
  31.                 print STDERR "Warning: argument $temp igorned.\n";
  32.         }
  33. }

  34. #检查各个传入的参数值是否为空
  35. if ( !defined($xmlfile) ) {
  36.         print STDERR "Error: argument '-f' is needed.\n";
  37.         exit;
  38. }

  39. if ( !defined($hostname) ) {
  40.         print STDERR "Error: argument '-h' is needed.\n";
  41.         exit;
  42. }

  43. if ( !defined($databasename) ) {
  44.         print STDERR "Error: argument '-d' is needed.\n";
  45.         exit;
  46. }

  47. if ( !defined($username) ) {
  48.         print STDERR "Error: argument '-u' is needed.\n";
  49.         exit;
  50. }

  51. #根据传入参数,拼接连接数据库的字符串
  52. my $connectionstr = "DBI:mysql:" . $databasename . ";host=" . $hostname;

  53. print "Conect to database " . $hostname . " " . "$databasename" . "... \n";

  54. #连接数据库
  55. my $dbh =
  56.   DBI->connect( $connectionstr, $username, $password,
  57.         { RaiseError => 1, AutoCommit => 0 } )
  58.   || die "Could not connect to database: $DBI::errstr";

  59. print "Start to parse source file ... \n";

  60. #载入xml
  61. my $parser = XML::LibXML->new();
  62. my $doc    = $parser->parse_file($xmlfile);

  63. print "Parse complete, ready to dump into database \n";


  64. #定义xml读出结果的变量
  65. my ( $a, $b, $c, $d, $e, $f, $g );

  66. #定义执行语句的结果
  67. my $success = 1;

  68. #设置一个计数器
  69. my $count   = 0;

  70. #开始遍历xml,把读出的值放在标量中,并打印导出内容到屏幕上
  71. my $root                     = $doc->getDocumentElement();
  72. my @acknowledgedAlarms_nodes = $root->childNodes;
  73. foreach my $acknowledgedAlarm (@acknowledgedAlarms_nodes) {
  74.         print "############\n";
  75.         if ( $acknowledgedAlarm->nodeType == ELEMENT_NODE ) {
  76.                 foreach my $values ( $acknowledgedAlarm->childNodes ) {

  77.                         if ( $values->nodeType != XML_TEXT_NODE ) {
  78.                                 if ( $values->nodeName() eq "a" ) {
  79.                                         print $values->nodeName() . ": "
  80.                                           . $values->textContent . "\n";
  81.                                         $a = $values->textContent;
  82.                                 }
  83.                                 elsif ( $values->nodeName() eq "b" ) {
  84.                                         print $values->nodeName() . ": "
  85.                                           . $values->textContent . "\n";
  86.                                         $b = $values->textContent;
  87.                                 }
  88.                                 elsif ( $values->nodeName() eq "c" ) {
  89.                                         print $values->nodeName() . ": "
  90.                                           . $values->textContent . "\n";
  91.                                         $c = $values->textContent;
  92.                                 }
  93.                                 elsif ( $values->nodeName() eq "d" ) {
  94.                                         print $values->nodeName() . ": "
  95.                                           . $values->textContent . "\n";
  96.                                         $d = $values->textContent;
  97.                                 }
  98.                                 elsif ( $values->nodeName() eq "e" ) {
  99.                                         print $values->nodeName() . ": "
  100.                                           . $values->textContent . "\n";
  101.                                         $e = $values->textContent;
  102.                                 }
  103.                                 elsif ( $values->nodeName() eq "f" ) {
  104.                                         print $values->nodeName() . ": "
  105.                                           . $values->textContent . "\n";
  106.                                         $f = $values->textContent;
  107.                                 }
  108.                                 elsif ( $values->nodeName() eq "g" ) {
  109.                                         print $values->nodeName() . ": "
  110.                                           . $values->textContent . "\n";
  111.                                         $g = $values->textContent;
  112.                                 }
  113.                                 else {
  114.                                         print $values->nodeName() . ": " . $values->textContent;
  115.                                         print "\n";
  116.                                 }
  117.                         }
  118.                 }

  119.                 #计数器加1
  120.                 $count++;
  121.                 print "############\n";

  122.                 #执行,当然最后commit才会放到数据库中
  123.                 my $insert_handle =
  124.                   $dbh->prepare_cached('INSERT INTO ack_alarms VALUES (?,?,?,?,?,?,?)');
  125.                 $success &&=
  126.                   $insert_handle->execute( $a, $b, $c,
  127.                         $d, $e, $f, $g );

  128.         }
  129. }

  130. #commit到数据库中,有问题则回滚
  131. my $result = ( $success ? $dbh->commit : $dbh->rollback );

  132. #写库失败的话终止
  133. unless ($result) {
  134.         $count=0;
  135.         $dbh->disconnect();
  136.         die "Couldn't finish transaction: " . $dbh->errstr;
  137. }

  138. #断开数据库链接
  139. $dbh->disconnect();

  140. print "Totally import " . $count . " rows to database \n";

复制代码

论坛徽章:
0
2 [报告]
发表于 2010-07-21 16:58 |只看该作者
1、能把注释加上么?
2、你具体要改进什么?

论坛徽章:
3
戌狗
日期:2014-09-10 17:07:162015年辞旧岁徽章
日期:2015-03-03 16:54:15wusuopu
日期:2016-06-17 17:43:45
3 [报告]
发表于 2010-07-21 17:26 |只看该作者
第90 95 100 105 110 115 120 125 行的print可以合成一行

另外,没看出对字母a,b,...,g的判断及$a,...$g的用处,或许可以简化

论坛徽章:
1
申猴
日期:2014-04-18 16:29:14
4 [报告]
发表于 2010-07-21 18:34 |只看该作者
我记得mysql cookbook后面有一章专门讲这东西的。lz可以去翻一下
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP