gpt4 book ai didi

xml - 在 Perl 中将类似 XML 的格式转换为 CSV

转载 作者:行者123 更新时间:2023-12-02 02:33:34 25 4
gpt4 key购买 nike

所以,我有一个如下所示的文件:

random stuff in the beginning...

<component>
<name>bob</name>
<age>7</age>
<country>Great_Britain</country>
</component>

<component>
<name>bob_secondbob</name>
<age>7</age>
<country>Great_Britain</country>
</component>

<component>
<name>bam</name>
<age>7</age>
<country>Great_Britain</country>
</component>

等等...

而且,我想将其作为 CSV 格式,如下所示:

name,age,country
bob,7,Great_Britain
bob_secondbob,7,Great_Britain
bam,7,Great_Britain

所以我想知道我该怎么做?

所以我当前的代码有像 bobbam 这样的词,所以我一直像这样查找它并使用 sed 来获取值:

grep -A4 "<component>" $file | grep -A4 "<name>$bob.*</name>" | grep "<name>" 
grep -A4 "<component>" $file | grep -A4 "<name>$bob.*</name>" | grep "<age>"
grep -A4 "<component>" $file | grep -A4 "<name>$bob.*</name>" | grep "<country>"

etc...

其中变量$bob“bob”

但问题是有 2 个 bob.* 实例,我不知道如何将它们分开,以便将它们打印出来......

我查看了 XML 模块,但该文件不是完全 XML,所以我无法使用它...

就像 bam 一样,通过 grep 可以很容易地打印出来,但是如果有多个 bob.* 实例,而我需要它们,我不知道如何正确打印出来,因为 grep 会返回多个结果。

关于我如何解决这个问题有什么建议吗?

最佳答案

明确指出“文件不是完全 XML”并且不能使用 XML 库。真糟糕:(

然后使用正则表达式对其进行解析。请记住,人们必须始终关注输入文件以查看其格式是否发生变化;即使是最小的更改也很容易使正则表达式失效,充其量会导致程序崩溃,或者更糟糕的是,会导致安静的错误。

显示的格式很容易解析。这是一个基本的做法,解析类似 XML 的 component任何标签及其值的部分,然后按所需顺序打印给定的一组实际标签。

use warnings;
use strict;
use feature 'say';

my $section_name = 'component'; # XML-like section to parse
my @tags = qw(name age country); # given tags and their order

my (%record, $in_XML);

while (<>) {
if (/^\s*<$section_name>\s*$/) { $in_XML = 1 }
elsif (/^\s*<\/$section_name>\s*$/) { $in_XML = 0 }

if ( $in_XML and m{<([^<]+)> ([^<]+) </\g{1}>}x ) {
push @{$record{$1}}, $2;
}
}

# Print out CSV-style output, with given tags
say join ',', @tags;
for my $i (0..$#{$record{$tags[0]}}) {
say join ',', map { $record{$_}->[$i] } @tags;
}

对标签做了一些假设。一些重要的:每个标签对都在一行上;所有标签名称都是唯一的。如果这些不包含需要调整的代码,可以做什么,但需要一些工作。

除了匹配类似 XML 的开始和结束标记对之外,<tagname>...</tagname> ,我还添加了一个标志,用于指示何时在 component 内进行处理部分。测试 if 内的标志条件允许在 XML 之外进行其他处理,否则我们可能会 next if not $in_XML;之前if健康)状况。如果文本中的其他地方不会出现意外的类似 XML 的标记对,那么这整个过程可能就没有必要了。

请注意,不必指定和使用 @tags但可以打印文件中找到的标签,即 my @tags = keys %record ,如果这是可以接受的并且顺序无关紧要。

请添加测试来测试这些标签及其值是否确实符合预期。现实的输入文件往往偶尔会丢失或意外的部分。


如果可能的话,最好纠正“不是完全 XML”(使其成为 XML)并使用库。

关于xml - 在 Perl 中将类似 XML 的格式转换为 CSV,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64655663/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com