Perl分析xml文件并生成csv数据文件,同时写入数据库
#!/usr/bin/perluse XML::Simple;
use Data::Dumper;
use DBI;
use Encode;
use strict;
use encoding "gbk";
#判断是否传递XML文件参数
if (open(MYFILE, "$ARGV")) {
# here's what to do if the file opened successfully
print "\n\"$ARGV\" : file exist! parse beginning!\n";
#获得EMS名称
my @ems = split(/\_/,$ARGV);
print "@ems\n";
#获得XML文件数据
my $data = XMLin($ARGV);
#print Dumper($data);
#打印文件时间戳
print "Timestamp = $data->{'timestamp'}\n\n";
my $i = 0;
#判断是否存在下一条网元记录
print "appending to csv...\n";
while( $data->{'output'}->{'TopoMgr.NEAdditionalInfoType-array'}->{'TopoMgr.NEAdditionalInfoType'}->[$i] )
{
print "\@ record num = $i\n";
my $text = "$data->{'output'}->{'TopoMgr.NEAdditionalInfoType-array'}->{'TopoMgr.NEAdditionalInfoType'}->[$i]->{'neName'}\n";
print $text;
#将分析出的数据追加到FILE末尾
open(APPENDFILE, ">>perlne.dat");
#转为utf-8后不报字符串过长异常,不转不影响效果
Encode::_utf8_off($text);
print APPENDFILE ($text);
close(APPENDFILE);
# Connect to target DB
#my $dbh=DBI->connect("DBI:mysql:test:192.168.1.14", 'root', 'root');
my $dbh = DBI->connect( 'DBI:Oracle:ora10g','res_col','res_col');
#$dbh->do("SET character_set_client = 'utf-8'");
#$dbh->do("SET character_set_connection = 'utf-8'");
#$dbh->do("SET character_set_results= 'utf-8'");
#$dbh->do("SET names'gbk'");
#Encode::_utf8_off($nename);
# Insert one row
my $rows = $dbh->do("INSERT INTO neinfo(text) VALUES ('$text')");
$dbh->disconnect();
$i ++;
}
close(MYFILE);
# query
my $dbh = DBI->connect( 'DBI:Oracle:ora10g','res_col','res_col');
my $sqr = $dbh->prepare("SELECT * FROM neinfo");
$sqr->execute();
while ( my @row=$sqr->fetchrow_array() )
{
#print join('\t', @row)."\n";
print join(',', @row)."\n";
}
$sqr->finish();
$dbh->disconnect();
print 'END...';
}unless (open (MYFILE, "$ARGV")) {
die ("cannot open input file $ARGV\n");
close(MYFILE);
}
xml如下
<?xml version="1.0" encoding="GBK"?>
<outputlist timestamp="20090917232423">
<output>
<TopoMgr.NEAdditionalInfoType-array>
<TopoMgr.NEAdditionalInfoType>
<neId>134217729</neId>
<neName>测试1 </neName>
</TopoMgr.NEAdditionalInfoType>
<TopoMgr.NEAdditionalInfoType>
<neId>134217731</neId>
<neName>测试2 </neName>
</TopoMgr.NEAdditionalInfoType>
</TopoMgr.NEAdditionalInfoType-array>
</output>
</outputlist>
运行perl脚本时需要跟一个文件名的参数
页:
[1]