2013-01-06 51 views
1

我从INEX IMDB集合,它包括在几千目录中几百万的XML文件,结构是这样的:转换XML文件TRECTEXT格式

- 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应该是没有扩展名的文件名,ex person_1000.xml - > person_1000和XML文件的内容应该包装在标签中。

我假设我需要一些脚本,它将每个XML文件包含在集合中,并且标记如上所示并覆盖原始文件。请问你能帮帮我吗?

回答

0

我不熟悉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扩展,如果你不希望保留任何备份文件。如果您有任何问题,请告诉我。干杯。


更新,按照注释:

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' {} \; 
+0

谢谢大家,谢谢!这几乎可以工作,除了xml文件中的最后一个标记是AFTER。我不知道为什么。例如,文件'<?XML版本= “1.0” 编码= “UTF-8”?>巴萨姆阿贝德'转换为' person_2000 <?XML版本= “1.0” 编码=“UTF -8“?> Bassam Abed' – Meff

+0

好的我发现从'#(。*)\ n#'中删除'\ n'确实有效。再次感谢您的帮助! – Meff

+0

@Meff:很高兴你的工作。根据您上面的评论,我做了一个小小的更新。干杯。 – Steve