[英]Perl XML to CSV Parse
我一直在试图弄清楚如何将xml数据源解析为CSV文件,这让我有些疯狂。 我有一个数据源,我需要解析一个CSV文件。 我还需要能够将“节点ID”作为一列包含在内。 这是我所拥有的:
#!/usr/bin/perl
use warnings;
use strict;
use XML::XPath;
#Name of the CSV File
my $filename = "parse.csv";
#Create the file.
open(INPUT,">$filename") or die "Cannot create file";
#Collect the XML and set nodes
my($xp) = XML::XPath->new( join('', <DATA>) );
my(@records) = $xp->findnodes( '/CATALOG/CD' );
my($firstTime) = 0;
#Loop through each record
foreach my $record ( @records ) {
my(@fields) = $xp->find( './child::*', $record )->get_nodelist();
unless ( $firstTime++ ) {
#Print Headers
print( join( ',', map { $_->getName() } @fields ), "\n");
}
#Print Content
print( join( ',', map { $_->string_value() } @fields ), "\n");
}
#Close the file.
close(INPUT);
__DATA__
<FOOD>
<ITEM id='1'>
<Color>Brown</Color>
<Name>Steak</Name>
</ITEM>
<ITEM id='2'>
<Color>Blue</Color>
<Name>Blueberries</Name>
</ITEM>
<ITEM id='3'>
<Color>Red</Color>
<Name>Apple</Name>
</ITEM>
</FOOD>
它创建了一个CSV,但是它是空的,我认为是因为foreach循环中的打印行。
任何帮助将不胜感激!
您正在将标题和内容打印到标准输出,而不是输出到输出文件。 您需要将文件句柄作为第一个参数传递,以在print
要与要打印的内容之间保持逗号之间没有逗号。 类似于: print FILE join(',', ...), "\\n";
我还建议不要将INPUT
用作要输出到的文件句柄-这会使理解代码有些混乱。
鉴于XML模式的简单性,使用AnyData
更容易
例如:
#!/usr/bin/perl
# This script converts a XML file to CSV format.
# Load the AnyData XML to CSV conversion modules
use XML::Parser;
use XML::Twig;
use AnyData;
my $input_xml = "test.xml";
my $output_csv = "test.csv";
$flags->{record_tag} = 'ITEM';
adConvert( 'XML', $input_xml, 'CSV', $output_csv, $flags );
将您的数据结构(XML)转换为:
id,Color,Name
1,Brown,Steak
2,Blue,Blueberries
3,Red,Apple
在您的情况下,您正在使用/ CATALOG / CD而不是数据。 请使用类似
my(@records) = $xp->findnodes( '/FOOD/ITEM' );
....
...
...
print INPUT ( join( ',', map { $_->getName() } @fields ), "\n" );
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.