我有近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。
此处和其他地方描述的方法。我能够将所有标签信息提取到一个平面文件中,但没有什么接近我上面所寻找的。我需要一些技术来提取文件名和标签。
如果有人能说明如何解决这个问题,我将不胜感激。
谢谢!
答案 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