【问题标题】:Convert XML files to TRECTEXT format将 XML 文件转换为 TRECTEXT 格式
【发布时间】:2012-12-20 14:00:13
【问题描述】:

我有来自 INEX 的 IMDB 集合,其中包含数千个目录中的数百万个 XML 文件,其结构如下:

- actors
-- 000
--- person_1000.xml
--- ...
-- 001
--- person_1001.xml
--- ...
...
- movies
-- 000
--- 10000.xml
--- ...
...

我需要将这些文件转换成TRECTEXT格式,即

<DOC>
 <DOCNO> document_number </DOCNO>  
 <TEXT>  XML file goes here. </TEXT>  
</DOC>

其中 document_number 应该是不带扩展名的文件名,例如person_1000.xml -> person_1000 和 XML 文件的内容应该包含在标签中。

我假设我需要一些脚本来包装集合中的每个 XML 文件,以及如上所示的标签并覆盖原始文件。你能帮帮我吗?

【问题讨论】:

    标签: xml bash shell converter


    【解决方案1】:

    我不熟悉 TRECTEXT 格式,但这里有一个使用 Perl 的单行代码,应该可以满足您的需求:

    find . -type f -name "*.xml" -exec perl -MFile::Basename -0777pi.bak -e 's#(.*)\n#"<DOC>\n <DOCNO> ".basename($ARGV,".xml")." </DOCNO>\n <TEXT> ".$1." </TEXT>\n</DOC>\n"#es' {} \;
    

    如果您不想保留任何备份文件,显然删除 .bak 扩展名。如果您有任何问题,请告诉我。干杯。


    根据 cmets 更新:

    find . -type f -name "*.xml" -exec perl -MFile::Basename -0777pi.bak -e 's#.*#"<DOC>\n <DOCNO> ".basename($ARGV,".xml")." </DOCNO>\n <TEXT> ".$&." </TEXT>\n</DOC>\n"#es' {} \;
    

    【讨论】:

    • 谢谢,谢谢!这几乎可以工作,除了 xml 文件中的最后一个标签是 AFTER 之后。我不知道为什么。例如,文件&lt;?xml version="1.0" encoding="UTF-8"?&gt;&lt;person&gt;&lt;name&gt;Bassam Abed&lt;/name&gt;&lt;/person&gt; 转换为&lt;DOC&gt;&lt;DOCNO&gt; person_2000 &lt;/DOCNO&gt; &lt;TEXT&gt; &lt;?xml version="1.0" encoding="UTF-8"?&gt;&lt;person&gt;&lt;name&gt;Bassam Abed&lt;/name&gt;&lt;/TEXT&gt;&lt;/DOC&gt;&lt;/person&gt;
    • 好的,我发现从s#(.*)\n# 中删除\n 可以解决问题。再次感谢您的帮助!
    • @Meff:很高兴你成功了。根据您上面的评论,我做了一个小更新。干杯。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-08
    • 2021-02-04
    • 1970-01-01
    • 1970-01-01
    • 2011-07-04
    相关资源
    最近更新 更多