从XML文件中提取标签信息到Excel文件

我有近100个标签中包含各种存储过程名称的XML文件。 每个文件可能包含多个SP或相同的重复。

<DataSourceName>SQL300</DataSourceName> <CommandType>StoredProcedure</CommandType> <CommandText>dbDummy.dbo.abc456Audit </CommandText> 

我接pipe了一个项目,将SQL服务器数据迁移到SAS网格,并将所有SSRS报告迁移到SAS。 我将不得不映射所有的数据。

有没有简单的Linux / Perl / VBA / Python的方式来做到这一步? 我想要这样的东西:

 File Name Stored Procedures Audit93 dbDummy.dbo.abc456Audit Audit93 dbDummy.dbo.abc123Audit 

我试过:grep,sed,awk,perl,VBA。

这里和其他地方描述的方法。 我可以将所有的标签信息提取到一个平面文件中,但没有接近我在上面寻找的东西。 我需要一些技巧来提取文件名和标签。

如果有人能够阐明如何解决这个问题,我将不胜感激。

谢谢!

你可以试试下面的代码:

 use strict; use warnings; use Excel::Writer::XLSX; my $dir = $ARGV[0]; opendir(DIR, "$dir") || die "Couldn't open the directory - $!"; my @files = grep(/\.xml$/,readdir(DIR)); my $OutFile = "Output". "\." . "xlsx"; my $workbook = Excel::Writer::XLSX->new($OutFile); my $worksheet = $workbook->add_worksheet('SotredProcedures'); # Create a format for the column headings my $header = $workbook->add_format(); $header->set_bold(); $header->set_color('red'); # Create a Text Wrap format my $format1 = $workbook->add_format(); $format1->set_text_wrap(); $worksheet->write(0, 0, "Filenames", $header); $worksheet->write(0, 1, "Stored Procedures", $header); $worksheet->set_column(0, 1, 12); $worksheet->set_column(1, 2, 100); my $row=1; foreach our $filename (@files){ my $document = do { local $/ = undef; open my $fh,'<',$filename or die "Couldn't open the file $filename:$!"; <$fh>; }; my $checkval = "false"; while($document =~ /<CommandText>(.*?)<\/CommandText>/isg) { if($1 ne "") { $checkval = "true"; $worksheet->write($row,0,$filename,$format1); $worksheet->write($row,1,$1,$format1); $row++; } } if($checkval eq "false") { print "No <CommandText> Value in $filename\n"; } } 

@Praveen的Perl解决scheme更好(更强大,并产生更丰富的Excel);

遵循一个简单的命令来build立一个tab分隔值,可能会做的工作:

 ( echo -e "file\tSP" ; grep -PoH '(?<=<CommandText>).*?(?=<)' *.xml | tr ':' '\t' ) > stored_proc.tsv 

如果你喜欢xls文件:

 ssconvert stored_proc.tsv stored_proc.xls 

最后用excel,gnumeric,不pipe…

 gnumeric stored_proc.tsv