【问题标题】:Extract tag info from XML files to Excel file [closed]从 XML 文件中提取标签信息到 Excel 文件 [关闭]
【发布时间】:2015-05-09 23:30:19
【问题描述】:

我有近 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。

这里和其他地方描述的方法。我可以将所有标签信息提取到一个平面文件中,但与我在上面寻找的内容完全不同。我需要一些技术来提取文件名和标签。

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

谢谢!

【问题讨论】:

  • 输出和输入的关系不清楚...
  • 对不起,基本上我想提取标签 dbDummy.dbo.abc456Audit 之间的信息并将它们放入每个 XML 文件的 excel 文件中。我想要一些关于 excel 文件中 XML 文件名的指示符。
  • 所以最后你需要第一行中的xml文件名和第二行中之间的数据被放置在excel文件中。对所有 100 个 xml 文件重复此操作并将其放在同一个 excel 文件中?这是你要找的吗?
  • 没错,感谢您澄清我的问题。
  • 除了 CSV 输出(Excel 将导入)之外,您是否还需要更多控制权

标签: xml excel perl vba parsing


【解决方案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";
              }   

        }     

【讨论】:

  • 感谢你们两位的 perl 脚本。当我尝试时,似乎 Excel::Writer::XLSX 没有安装在 ksh 中。我正在尝试查看如何安装,然后尝试一下。
【解决方案2】:

@Praveen' Perl 解决方案更好(更健壮,生成更丰富的 excel);

按照一个简单的命令来构建一个制表符分隔值 可能会完成这项工作:

( 
  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

【讨论】:

  • 我安装了这些软件包,但 MakeMaker 没有找到 Excel::Writer::XLSX,反之亦然,因为它们安装在不同的地方。由于我以前从未使用过 perl,因此我正在网上搜索以解决此问题,以便我可以尝试上面的脚本。谢谢!
  • @user2939050,我的解决方案没有使用 Excel::Writer::XLSX; Perl 模块一般可以通过sudo cpan Excel::Writer::XLSX 安装。你是什​​么操作系统等?
  • 我多次尝试后也无法正确安装这些软件包。我有 Red Hat Enterprise Linux Server 6.5 版(圣地亚哥)。上面的 JJoao 解决方案不起作用。正在获取 suexec: Program cpan not found 错误
  • JJoao....非常感谢脚本。我尝试在 sh 中运行,它工作并在 1 秒内创建了 tsv 文件。我一直在想它是一个 perl 脚本。我使用python转换为csv并在excel中打开它。它工作得很好,我得到了我想要的。感谢您的帮助!
  • user2939050,为了让@Praveen 解决方案正常工作(注意 Praveen 不会收到关于您在我的回答下编写的 cmets 的通知),您需要 Perl 正常工作:) -- 建议:sudo yum install perl-CPAN拥有 cpan 命令(用于安装 perl 模块);也请尝试sudo yum install perl-Excel-Writer-XLSX
猜你喜欢
  • 2015-09-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-15
  • 1970-01-01
  • 2023-03-14
相关资源
最近更新 更多