将标记信息从XML文件提取到Excel文件

时间:2015-05-09 23:30:19

标签: xml excel perl vba parsing

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

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

我接手了一个项目,将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。

此处和其他地方描述的方法。我能够将所有标签信息提取到一个平面文件中,但没有什么接近我上面所寻找的。我需要一些技术来提取文件名和标签。

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

谢谢!

2 个答案:

答案 0 :(得分:1)

您可以尝试以下代码:

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";
              }   

        }     

答案 1 :(得分:0)

@Praveen'Perl解决方案更好(更强大,并且产生更丰富的excel);

按照一个简单的命令来构建一个tab-separated-value 可能会做这个工作:

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

如果您更喜欢xls文件:

ssconvert stored_proc.tsv stored_proc.xls

最后用excel,gnumeric,无论......来看结果。

gnumeric stored_proc.tsv