【发布时间】:2021-02-15 16:58:09
【问题描述】:
所以,我有一个看起来像这样的文件:
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
所以我想知道我该怎么做呢?
所以我当前的代码有 bob 和 bam 这样的词,所以我一直在寻找它并使用 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";
但问题是bob.* 有 2 个实例,我不知道如何将它们分开,所以我可以将它们打印出来......
我查看了 XML 模块,但这个文件不完全是 XML,所以我不能使用它...
像 bam 这样通过 grep 可以很容易地打印出来,但是如果有多个 bob.* 实例我需要它们,我知道如何正确打印它,因为 grep 会返回多个结果。
有什么建议可以解决这个问题吗?
【问题讨论】:
-
“Grep”可能不是要走的路。我建议使用具有良好 XML 库的语言编写一个简短的脚本或程序。 Perl(您的标签之一)符合要求。我会 1) 获取 Perl LibXML,2) 解析你的 XML 文件,一次是一个“
”元素,3) 写你的 .CSV,一次一行。 -
"这个文件不是完全的 XML" -- (1) 这究竟是什么意思?它有多远? (2) 如果它不能用一个库来完成,那么你就只能使用正则表达式了,你所展示的内容并不难解析。当然,问题在于将来或其他文件中的任何微小更改都可能需要您重写正则表达式(或者可能会悄悄引入错误)
-
如果您的文件实际上是 XML,则需要存在“随机内容”,以便您的示例数据是有效的 XML。
-
@Shawn 我认为他们没有完全有 XML,通过标题和文本中的声明。但我同意最好制作正确的XML并使用库:)
-
我会逐行读取文件,根据需要复制或修改每一行以创建格式良好的 XML 输出;然后使用 XSLT 或 XQuery 等标准技术处理 XML。