【问题标题】:search and replace enumerating found strings搜索和替换枚举找到的字符串
【发布时间】:2014-02-23 21:12:58
【问题描述】:

我有一个由文章分隔的巨大文本文件 (18Gb),每篇文章都有这样的标题:

<text id="1403" year="" url_source="http://www.adobe.de" error="0.008696">

问题是我应该为每篇文章有一个不同的id,但是有一些重复的,所以我需要做的是沿着文件查找id并从1开始连续重新枚举它们。我一直环顾四周,但我没有找到合适的解决方案,可能是因为我缺乏知识,我会感谢您的建议

【问题讨论】:

  • 整个文件是 XML 吗?
  • 内容是这样的 blah blah blah blah .....呜呜呜呜呜呜……
  • 您能再给我们看一些您的文件吗?
  • 听起来你有一个 XML 文件。使用迭代 XML 解析器; Python 有 ElementTree API 和 iterparse 方法。
  • 对我来说是中文但我会找它,谢谢

标签: python perl shell text replace


【解决方案1】:

在 python 中: 如果是有效的xml文件,可以使用ElementTree等xml解析器。

否则,遍历输入文件并写入输出文件:

new_id=1
with open('out_file','w') as out_f:
    with open('in_file','r') as in_f:
        for line in in_f:
            if line[:5] == '<text':
                newline = line.split(' ')
                newline[1] = "id=" + '"' + str(new_id) + '"'
                newline = ' '.join(newline)
                line = newline
                new_id += 1
            out_f.write(line)

请注意,这假定每个&lt;text ... 标记都从行首开始。如果不是这样,你必须稍微修改一下。

【讨论】:

    【解决方案2】:

    假设 id 始终是每个文本标签的第一个属性,在 Perl 中:

    perl -M5.010 -wpi.bak -e'our $article; s/<text id="\K[0-9]+/++$article/ge' hugetextfile
    

    请注意,它会用添加的 .bak 重命名您的文件并通读它,写出原始名称,因此您需要 18Gb 可用空间。

    【讨论】:

    • 警告只能对一个班轮产生噪音?
    • 您应该始终使用警告,即使在单行上也是如此。另一方面,严格......
    • 非常感谢,它工作得很好,我会按照你的方式做,因为它更快
    猜你喜欢
    • 1970-01-01
    • 2018-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-03
    • 1970-01-01
    相关资源
    最近更新 更多